问题描述
我需要能够在运行时合并两个(非常简单的)JavaScript对象。例如,我想:
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }
obj1.merge(obj2);
//obj1 拥有三个属性: food, car 和 animal
有没有人有这个脚本或知道内置的方法来做到这一点?
解决方案
ECMAScript 2018标准方法
你可以使用对象展开运算符:
let merged = {...obj1, ...obj2};
/** 需要合并的对象数量没有限制.
* 相同名称的属性,后者覆盖前者. */
const allRules = {...obj1, ...obj2, ...obj3};
ECMAScript 2015(ES6)标准方法
/* 按照问题描述中的情形,你可以使用: */
Object.assign(obj1, obj2);
/** 需要合并的对象数量没有限制.
* 所有的对象属性都将会合并到第一个对象中.
* 只有第一对象会被修改并返回.
* 后者的同名属性值覆盖前者. */
const allRules = Object.assign({}, obj1, obj2, obj3, etc);
(参见MDN JavaScript参考)
ES5和早期的方法
for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }
请注意,这会简单地添加obj2
的所有属性到obj1
中,这可能不是你想要的,如果你不希望修改obj1
的话。
如果以不希望合并obj2
对象中继承自原型对象上的属性,你还需要使用hasOwnProperty
来过滤一遍。
代码示例:
/**
* 如果存在同名的属性,objs2 会覆盖 obj1,否则直接添加
* @param obj1
* @param obj2
* @returns obj3 一个新的对象,基于obj1和obj2
*/
function merge_options(obj1,obj2){
var obj3 = {};
for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
return obj3;
}