JavaScript中如何将深层嵌套数组完全展开为一维数组?
嵌套数组完全展开的解决方案
问题原因
Array.prototype.flat() 方法默认的展开深度参数为1,仅会处理第一层嵌套数组,无法处理更深层级的嵌套,所以你之前的调用只展开了一层结构。
可选解决方案
1. 直接调用flat传参(最简便,ES2019+环境支持)
给flat()传入参数Infinity,即可实现任意深度的嵌套数组完全展开:
const result = arr.flat(Infinity);
执行后得到的完全展开结果为:[1,2,3,4,5,6,7,8,9,10,21,22,24,25,26,23,11,12,13,14,15,16,17,18,19,20]
2. 手动递归实现(兼容低版本运行环境)
如果需要兼容不支持ES2019的旧环境,可以自行实现递归逻辑完成展开:
function flatten(arr) { let result = []; for (const item of arr) { if (Array.isArray(item)) { result = result.concat(flatten(item)); } else { result.push(item); } } return result; } // 调用方法 const result = flatten(arr);
3. 结合reduce简化递归写法
可以用Array.prototype.reduce简化递归逻辑的代码:
const flatten = arr => arr.reduce((prev, curr) => prev.concat(Array.isArray(curr) ? flatten(curr) : curr), []);
4. JSON序列化快速实现(存在使用限制)
如果数组内所有元素都是JSON支持的基础类型(不存在undefined、Symbol、函数、循环引用等场景),也可以用该方法快速实现:
const result = JSON.parse(`[${JSON.stringify(arr).replace(/\[|\]/g, '')}]`);
注意:该方法会丢失不被JSON规范支持的元素类型,仅适合纯基础类型的嵌套数组使用
内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur
相关产品推荐
相关产品推荐

