如何高效移除对象数组的一层嵌套 实现数组扁平化
适配场景的最简实现方案
你当前的数组是刚好一层的嵌套结构,完全不需要手写遍历逐次push到新数组,用原生内置方法1行代码就能搞定,实现效率还比自写循环更高。
优先推荐:原生flat()方法(最直观)
ES2019提供的Array.prototype.flat()默认就会拉平数组的1层嵌套,和你的数据结构完全匹配:
let arr = []; arr.push([{id:1}]); arr.push([{id:2}, {id: 3}]); arr.push([{id:4}]); // 直接拉平1层即可 let res = arr.flat(); // 最终输出:[{id:1}, {id:2}, {id:3}, {id:4}]
- 兼容说明:主流浏览器、Node.js 11+环境全支持,常规业务开发可以直接用
- 注意事项:如果后续遇到多层不确定的嵌套,给
flat()传Infinity参数可以递归拉平所有层级,但你当前的场景完全不需要,传默认值没有多余的递归开销,执行效率最高。
高兼容备用方案
如果项目需要兼容不支持flat()的老旧运行环境,可以用concat配合展开运算符实现完全一致的效果:
let res = [].concat(...arr);
这个写法的原理是把原数组的每一层元素拆出来传给concat,concat会自动把传入的数组展平后合并到结果中,兼容性比flat()好很多。
如果连展开运算符都不支持的更老环境,可以用apply实现同样逻辑:
let res = Array.prototype.concat.apply([], arr);
效果说明
针对你给出的测试数据,上面所有方法的输出结果都和你预期的一维对象数组完全一致,没有多余嵌套,代码量远少于自写遍历的方案,而且内置方法的实现是经过引擎优化的,执行性能也优于JS层手写的循环逻辑。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

