数组扁平化(Array Flattening) 是指将一个多维数组(嵌套数组)转换成一个一维数组的过程。例如,将 [1, [2, [3, 4]], 5] 扁平化为 [1, 2, 3, 4, 5]。
1. 为什么需要数组扁平化?
在数据处理中,数组可能包含多层嵌套结构(如从 API 获取的 JSON 数据),但某些操作(如 map、filter、reduce 或直接遍历)通常需要一维数组。扁平化可以简化数据结构,便于后续处理。
2. 数组扁平化的方法
方法 1:使用 Array.flat()(ES2019+ 原生方法)
constarr=[1,[2,[3,4]],5];constflattenedArr=arr.flat(2);// 指定扁平化的深度(2层嵌套)console.log(flattenedArr);// [1, 2, 3, 4, 5]- 参数:flat() 接受一个可选参数 depth(默认 1),表示要扁平化的嵌套层数。
- flat():扁平化 1 层。
- flat(Infinity):完全扁平化所有嵌套。
方法 2:递归实现
如果环境不支持 flat(),可以用递归手动实现:
functionflatten(arr){letresult=[];for(constitemofarr){if(Array.isArray(item)){result.push(...flatten(item));// 递归处理嵌套数组}else{result.push(item);}}returnresult;}constarr=[1,[2,[3,4]],5];console.log(flatten(arr));// [1, 2, 3, 4, 5]方法 3:使用 reduce() + 递归
结合 reduce() 和递归实现:
functionflatten(arr){returnarr.reduce((acc,val)=>{returnacc.concat(Array.isArray(val)?flatten(val):val);},[]);}constarr=[1,[2,[3,4]],5];console.log(flatten(arr));// [1, 2, 3, 4, 5]方法 4:使用 toString()(仅适用于数组元素均为数字或字符串)
如果数组元素都是数字或字符串,可以通过 toString() 或 join() 转换后拆分:
constarr=[1,[2,[3,4]],5];constflattenedArr=arr.toString().split(',').map(Number);// 注意:需处理类型console.log(flattenedArr);// [1, 2, 3, 4, 5]- 缺点:仅适用于简单数据类型,复杂对象会变成 [object Object]。
方法 5:使用 Generator 函数(ES6+)
通过生成器函数实现惰性扁平化:
function*flattenGenerator(arr){for(constitemofarr){if(Array.isArray(item)){yield*flattenGenerator(item);// 递归生成}else{yielditem;}}}constarr=[1,[2,[3,4]],5];constflattenedArr=[...flattenGenerator(arr)];console.log(flattenedArr);// [1, 2, 3, 4, 5]3. 实际应用场景
- 处理 API 返回的嵌套数据:
constapiData=[{id:1,tags:['js','vue']},{id:2,tags:['react','node']}];constallTags=apiData.flatMap(item=>item.tags);// [ 'js', 'vue', 'react', 'node' ] - 合并多个数组:
constarr1=[1,2];constarr2=[3,[4,5]];constmerged=[...arr1,...flatten(arr2)];// [1, 2, 3, 4, 5] - 数据清洗:
- 去除嵌套结构中的空数组或无效值。
4. 性能对比
| 方法 | 适用场景 |
|---|---|
| flat() | 现代浏览器/Node.js 环境 |
| 递归 | 通用,但需注意堆栈溢出 |
| reduce() + 递归 | 函数式编程风格 |
| toString() | 仅简单数据类型 |
| Generator | 惰性求值,大数据量时节省内存 |
5. 总结
- 推荐方法:优先使用原生 flat(),简单高效。
- 兼容性处理:如果环境不支持 flat(),用递归或 reduce() 实现。
- 特殊需求:如需惰性求值或处理大数据量,考虑 Generator。