[TOC]
写作不易,Star是最大鼓励,感觉写的不错的可以给个Star⭐,请多多指教。Github地址。
Array.prototype.flat()方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
flat实现
1. 递归实现
function myFlat(arr) {
const _result = [];
let fn = arr => {
for (let i = 0; i < arr.length; i++) {
let item = arr[i];
if (Array.isArray(item)) {
fn(item);
}
else {
_result.push(item);
}
}
}
fn(arr);
return _result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2. 基于reduce
const arr = [1, [2, [3, [4, 5]]], 6];
// [].concat(1) => [1]
function myFlat(arr) {
// 如果传入的参数不是数组,直接返回
if (!Array.isArray(arr)) return arr;
return arr.reduce((prev, val) => {
console.log(val);
return prev.concat(myFlat(val));
}, []);
}
console.log(myFlat(arr)); // [ 1, 2, 3, 4, 5, 6 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
// console.log(val);的值
1
[ 2, [ 3, [ 4, 5 ] ] ]
2
[ 3, [ 4, 5 ] ]
3
[ 4, 5 ]
4
5
6
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
3. 扩展运算符
const arr = [1, [2, [3, [4, 5, 6]]], 7];
function myFlat(arr) {
// 只要arr中还存在数组就继续循环
while (arr.some(Array.isArray)) {
arr = [].concat(...arr);
}
return arr;
}
console.log(myFlat(arr)); // [ 1, 2, 3, 4, 5, 6 ]
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
[ 1, [ 2, [ 3, [Array] ] ], 7 ]
[ 1, 2, [ 3, [ 4, 5, 6 ] ], 7 ]
[ 1, 2, 3, [ 4, 5, 6 ], 7 ]
1
2
3
2
3