我需要能够在运行时合并两个(非常简单的)JavaScript对象。例如,我想:
var obj1 = { food: 'pizza', car: 'ford' } var obj2 = { animal: 'dog' } obj1.merge(obj2); //obj1 now has three properties: food, car, and animal
有没有人为此提供脚本或知道内置的方式来执行此操作?我不需要递归,也不需要合并函数,只需合并平面对象上的方法即可。
ECMAScript 2018标准方法
您将使用对象传播:
let merged = {...obj1, ...obj2};
merged现在是obj1和的并集obj2。中的属性obj2将覆盖中的属性obj1。
merged
obj1
obj2
/** There's no limit to the number of objects you can merge. * Later properties overwrite earlier properties with the same name. */ const allRules = {...obj1, ...obj2, ...obj3};
这也是此语法的MDN文档。如果您正在使用babel,则需要babel-plugin-transform-object-rest-spread插件才能正常工作。
ECMAScript 2015(ES6)标准方法
/* For the case in question, you would do: */ Object.assign(obj1, obj2); /** There's no limit to the number of objects you can merge. * All objects get merged into the first object. * Only the object in the first argument is mutated and returned. * Later properties overwrite earlier properties with the same name. */ const allRules = Object.assign({}, obj1, obj2, obj3, etc);
ES5和更早版本的方法
for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }
请注意,这会简单地添加的所有属性obj2,以obj1这可能不是你想要什么,如果你仍然想使用未修改obj1。
如果您使用的框架覆盖了您的所有原型,那么您必须对诸如的检查更为精通hasOwnProperty,但是该代码将在99%的情况下都能正常工作。
hasOwnProperty
示例功能:
/** * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1 * @param obj1 * @param obj2 * @returns obj3 a new object based on obj1 and 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; }