什么是数组扁平化
就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层的数组。
flatten
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
递归
// ES6
const flatten = (arr) => {
let res = [];
arr.forEach((item, index, arr) => {
if (Array.isArray(item)) {
result = result.concat(flatten(item));
} else {
result.push(arr[i]);
}
})
return result;
}
// ES5
function flatten (arr) {
var result = [];
for (var i = 0; len = arr.length; i < len; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]));
} else {
result.push(arr[i]);
}
}
return result;
}
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
toString
该方法是利用 toString 把数组变成以逗号分隔的字符串,然后遍历数组把每一项再变回原来的类型
const flatten = (arr) => arr.toString().split(',').map((item) => +item)
function init (arr) {
var newArr = [];
if (arr instanceof Array) {
arr.forEach(function (value) {
newArr = newArr.concat(init(value));
})
} else {
newArr.push(arr);
}
return newArr;
}
init([1, [2], [3, [[4]]]]);
[].concat.apply + some
利用 arr.some 判断当数组中还有数组的话,循环调用 flatten 扁平函数(利用 [].concat.apply扁平), 用 concat 连接,最终返回 arr
const flatten = (arr) => {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat.apply([], arr);
}
return arr;
}
const arr = [1, 2, [3, 4]];
console.log(flatten(arr));
reduce
function flatten (arr) {
return arr.reduce(function (prev, cur){
return prev.concat(Array.isArray(cur) ? flatten(cur) : cur)
}, [])
}