Skip to content

扁平化数组

扁平化数组指的是:把多层嵌套数组展开成一维数组。

js
;[0, 1, [2, [3, 4]]]

展开后变成:

js
;[0, 1, 2, 3, 4]

最直接的写法:flat

js
function flat(arr) {
  return arr.flat(Infinity)
}

console.log(flat([0, 1, [2, [3, [4, 5]]]])) // [0, 1, 2, 3, 4, 5]

如果环境支持,这是最简洁的方案。

手写常见方案:递归

js
function flat(arr) {
  return arr.reduce((result, item) => {
    if (Array.isArray(item)) {
      result.push(...flat(item))
    } else {
      result.push(item)
    }

    return result
  }, [])
}

这类写法的核心是:

  • 遇到普通值,直接放入结果
  • 遇到数组,继续递归展开

指定展开层级

并不是所有场景都要展开到最深层。

js
console.log([1, [2, [3]]].flat(1)) // [1, 2, [3]]
console.log([1, [2, [3]]].flat(2)) // [1, 2, 3]

所以“扁平化”也可能是有限层展开,而不是永远 Infinity

一个容易忽略的点

flat() 只会处理数组嵌套,不会把对象之类的结构继续拆开:

js
console.log([1, { value: 2 }, [3]].flat()) // [1, { value: 2 }, 3]

使用建议

  • 环境允许时,优先用 flat()
  • 需要手写时,递归是最容易理解的方案。
  • 如果题目要求控制展开层级,要先确认是“全部展开”还是“展开 n 层”。

基于 MIT 许可发布