Appearance
23. 多维数组扁平化
多维数组扁平化就是将一个多维数组拍平为一维数组,经典面试题。例如,[1, [2, 3, [4, 5]], 6]
将变成 [1, 2, 3, 4, 5, 6]
。
思路不难,核心就是递归思想:
- 递归条件:传入的
item
为数组,进入下一轮递归 - 结束条件:传入的
item
都没有数组类型且都遍历过了
下面是自己总结的一些方法。
方法1:forEach + 尾递归
js
function myFlat(arr, res = []) {
arr.forEach(item => {
if (Array.isArray(item)) {
// item 为数组类型
myFlat(item, res)
} else {
// item 非数组类型
res.push(item)
}
})
return res
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
调用方法:myFlat(arr)
,res
为尾递归的参数,默认为空数组,不用传。
方法2:reduce + concat
js
function reduceFlat(arr) {
return arr.reduce(
(pre, cur) => pre.concat(
Array.isArray(cur) ? reduceFlat(cur) : cur)
, [])
}
1
2
3
4
5
6
2
3
4
5
6
方法3:reduce + spread 运算符
js
function reduceSpreadFlat(arr) {
return arr.reduce(
(pre, cur) => [
...pre,
...(Array.isArray(cur) ? reduceFlat(cur) : [cur])
]
, [])
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
方法4:toString
js
function toStringFlat(arr) {
// 若 arr 中都是数字类型,则最后要全部取整一下
return arr.toString().split(',').map(Number)
}
1
2
3
4
2
3
4
方法5:JSON.stringfy
js
function stringfyFlat(arr) {
return JSON.stringify(arr).replace(/\[|\]/g, '').split(',')
}
1
2
3
2
3
方法6:使用内置API flat
js
function innerFlat(arr) {
return arr.flat(Infinity)
}
1
2
3
2
3