主题
扁平化数组
扁平化数组指的是:把多层嵌套数组展开成一维数组。
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 层”。
