380 字
2 分钟
数组扁平化
2025-02-28

常用方法#

1. Array.prototype.flat(ES6推荐方法)#

TIP

​ 实现数组的”拉平”(扁平化),该方法返回一个新数组,对原数据没有影响。

​ 具有一个可选参数depth,用来指定深度,默认为1

​ 传入’Infinity’可以拉平任意深度的数组

const arr =  [4, 1, 2, 3, 6, [7, 8, [3, 9, 10, [4, 6, 11]]]]
console.log(arr.flat())	// [4, 1, 2, 3, 6, 7, 8, [3, 9, 10, [4, 6, 11]]]
console.log(arr.flat(2)) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, [4, 6, 11]]
console.log(arr.flat(Infinity)) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, 4, 6, 11]

2. 递归#

function flatten(arr) {
  return arr.reduce((acc, cur) => {
    return acc.concat(Array.isArray(cur) ? flatten(cur) : cur);
  }, []);
}
// 示例
flatten([1, [2, [3]]]); // [1, 2, 3]

3. 迭代展开#

function flatten(arr) {
  while (arr.some(item => Array.isArray(item))) {
    arr = [].concat(...arr);
  }
  return arr;
}

// 示例
flatten([1, [2, [3]]]); // [1, 2, 3]

4. toString 转换(仅适用于纯数字/字符串数组)#

[1, [2, [3]]].toString().split(',').map(Number); // [1, 2, 3]
// 注意:会强制转换元素类型(如 'a' → NaN)

5. Generator 函数(高级场景)#

function* flatten(arr) {
  for (const item of arr) {
    Array.isArray(item) ? yield* flatten(item) : yield item;
  }
}

// 示例
[...flatten([1, [2, [3]]])]; // [1, 2, 3]

总结#

方法优点缺点
Array.prototype.flat原生语法,简洁高效兼容性需注意(IE 不支持)
递归实现兼容性好,可控性强嵌套过深可能栈溢出
扩展运算符迭代无递归栈溢出风险性能较差(多次浅拷贝)
toString单行代码实现仅限数字/字符串,类型可能被破坏
Generator惰性计算,适合处理超大数组需要额外转换(如 [...]
数组扁平化
https://blog.oceanh.top/posts/frontend/数组扁平化常用方法/
作者
Ocean Han
发布于
2025-02-28
许可协议
CC BY-NC-SA 4.0
最后修改时间
2025-03-12 11:03:03