- 递归实现 reduce
- 迭代实现
- 控制展开层数
// 递归
function flatten1(arr){
if (!arr.length) return;
return arr.reduce((pre, cur) => {
// cur 依次是1, [2, 3, [4, 5]], 2, 3, [4, 5], 4, 5
// 判断当前元素是不是数组,是的话继续递归
return Array.isArray(cur) ? [...pre, ...flatten1(cur)] : [...pre, cur];
}, []);
};
function flatten3(arr, num = 1) {
if (!arr.length) return;
// num控制展开层数
return num > 0
? arr.reduce((pre, cur) => {
return Array.isArray(cur) ? [...pre, ...flatten3(cur, num - 1)] : [...pre, cur];
}, [])
: arr.slice();
}
const arr1 = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5];
console.log(flatten3(arr1, Infinity));
console.log(flatten3(arr1, 2));
// 迭代
const flatten2 = arr => {
if (!arr.length) return;
let res = arr.slice();
// 一直展开直到数组中没有数组元素了
while (res.some(item => Array.isArray(item))) {
res = [].concat(...res); // 数组中还有数组元素则继续展开一层数组
}
return res;
};
const flatten4 = (arr, num = 1) => {
if (!arr.length) return;
let res = arr.slice();
// num规定展开多少层
while (num > 0) {
if (res.some(item => Array.isArray(item))) {
res = [].concat.apply([], res); // 数组中还有数组元素则继续展开一层数组
} else {
break;
}
num--;
}
return res;
};
[].concat(...arr); [].concat.apply([], res);
实现数组展开一层,详见concat章节