如何动态合并两个JavaScript对象的属性?

问题描述

我需要能够在运行时合并两个(非常简单的)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;
}
用户头像
登录后发表评论