JavaScript中如何展开对象数组并合并为单个对象?
对象数组展开合并为单个平面对象实现方法
需求是将数组内每个独立对象的全部属性,整合到同一个平面对象中,例:
- 输入:
[{"one": "deleted"}, {"two": "added"}] - 输出:
{"one": "deleted", "two": "added"}
以下是不同场景下的实现方式,所有方式默认遵循同名属性后值覆盖前值的规则,如果有特殊的键冲突处理需求,可以在合并逻辑里加自定义判断。
- 方法1:ES6 原生
Object.assign实现
利用展开运算符把数组项拆成Object.assign的参数,直接把所有源对象的可枚举属性拷贝到空目标对象上,写法最简洁:const sourceArr = [{"one": "deleted"}, {"two": "added"}]; const mergedObj = Object.assign({}, ...sourceArr); // mergedObj 即为合并后的结果 {one: 'deleted', two: 'added'} - 方法2:
reduce配合对象展开运算符实现(ES2018+支持)
以空对象为初始值,遍历数组时每次把当前累积对象和当前遍历对象的属性合并,作为下一次遍历的累积值:const sourceArr = [{"one": "deleted"}, {"two": "added"}]; const mergedObj = sourceArr.reduce((res, current) => ({...res, ...current}), {}); - 方法3:手动遍历兼容低版本环境
如果运行环境不支持ES6+语法,可以通过两层循环手动赋值,注意用hasOwnProperty过滤掉原型链上的非自有属性:const sourceArr = [{"one": "deleted"}, {"two": "added"}]; const mergedObj = {}; for (let i = 0; i < sourceArr.length; i++) { const item = sourceArr[i]; for (let key in item) { if (item.hasOwnProperty(key)) { mergedObj[key] = item[key]; } } }
如果业务场景里数组中的对象存在同名键,且不需要后值覆盖前值,可以在赋值前判断键是否已存在,按需做值拼接、转数组存储等自定义处理。
内容的提问来源于stack exchange,提问作者Danil Pobirsky
相关产品推荐
相关产品推荐

