Skip to content

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

调用方法: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

方法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

方法4:toString

js
function toStringFlat(arr) {
  // 若 arr 中都是数字类型,则最后要全部取整一下
  return arr.toString().split(',').map(Number)
}
1
2
3
4

方法5:JSON.stringfy

js
function stringfyFlat(arr) {
  return JSON.stringify(arr).replace(/\[|\]/g, '').split(',')
}
1
2
3

方法6:使用内置API flat

js
function innerFlat(arr) {
  return arr.flat(Infinity)
}
1
2
3