# 展开多级数组
# 递归
function steamrollArray(arr) {
let res = []
// 遍历
for (const a of arr) {
// 判断是否是数组
if(a instanceof Array){
// 是,则递归调用
res = res.concat(steamrollArray(a))
}else{
// 不是则直接放入
res.push(a)
}
}
return res;
}
console.log(steamrollArray([1, [2], [3, [[4]]]]));// [1,2,3,4]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# flat
使用数组自身提供的方法Array.prototype.flat(arr,deep)
- 参数1:
arr
待操作的数组 - 参数2:
deep
展开深度- 默认:1
- 返回:一个新的数组
console.log([1, [2], [3, [[4]]]].flat(Infinity)); // [1,2,3,4]
console.log([1, [2], [[3]].flat()); // [1,2,[3]]
console.log([1, [2], [[3]].flat(1)); // [1,2,[3]]
1
2
3
2
3
# replace + JSON.parse + JSON.stringify
function Flat(arr) {
arr = JSON.stringify(arr)
arr = JSON.parse('[' + arr.replace(/\[|\]/g, '') + ']')
return arr
}
let a = [{ a: 1 }, { b: 2 }, 3, 4, 5, [6, [7, 8, [9]]]]
console.log(Flat(a))
// [ { a: 1 }, { b: 2 }, 3, 4, 5, 6, 7, 8, 9 ]
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# reduce 递归
let a = [{ a: 1 }, { b: 2 }, 3, 4, 5, [6, [7, 8, [9]]]]
function Flat(arr) {
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? Flat(cur) : cur)
}, [])
}
console.log(Flat(a))
// [ { a: 1 }, { b: 2 }, 3, 4, 5, 6, 7, 8, 9 ]
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 扩展运算符迭代
let a = [{ a: 1 }, { b: 2 }, 3, 4, 5, [6, [7, 8, [9]]]]
function Flat(arr) {
while (arr.some(Array.isArray)) {
arr = [].concat(...arr)
}
return arr
}
console.log(Flat(a))
// [ { a: 1 }, { b: 2 }, 3, 4, 5, 6, 7, 8, 9 ]
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9