JavaScript 如何将嵌套单元素对象数组归一化为平铺对象数组
二维嵌套对象数组转一维平铺数组实现方案
针对你给出的固定两层嵌套结构的数组,根据不同运行环境的兼容性要求,可选择以下对应最优解法:
- 现代运行环境首选(代码量最少,语义最清晰)
直接使用ES2019新增的数组原生方法flat(),该方法默认会移除数组的一层嵌套层级,完全匹配当前场景的结构特征:
所有现代浏览器、Node.js 11及以上版本均支持该方法,无需引入任何第三方依赖,是该场景下的最优实现。var arr = [ [{a:1}], [{b:1}], [{c:1}], [{d:1}], [{e:1}] ] var flatArr = arr.flat() // 最终输出:[{a:1},{b:1},{c:1},{d:1},{e:1}] - 低版本环境兼容方案
- 支持ES6语法的环境可直接使用
concat结合展开运算符实现,效果和flat()完全一致:
原理是将原数组的每个子数组作为入参传给var flatArr = [].concat(...arr)concat方法,自动将分散在各子数组中的对象拼合为同一维度的一维数组。注:如果原数组元素规模超过1万条,展开运算符可能触发参数长度栈溢出,这类大数组场景优先使用原生flat()方法。 - 无ES6语法支持的全兼容环境,可通过手动迭代遍历实现:
var flatArr = [] arr.forEach(function(subArr) { subArr.forEach(function(item) { flatArr.push(item) }) })
- 支持ES6语法的环境可直接使用
注意事项:如果后续遇到任意深度嵌套的同类型数组,无需修改递归逻辑,直接给
flat()方法传入Infinity参数即可实现全层级无差别拍平,比如arr.flat(Infinity)可以处理任意嵌套深度的数组结构。
内容的提问来源于stack exchange,提问作者user4965201
相关产品推荐
相关产品推荐

