我需要能够在运行时合并两个(非常简单)JavaScript对象。例如,我想:
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }
obj1.merge(obj2);
//obj1 now has three properties: food, car, and animal
是否有一种内置的方法来实现这一点?我不需要递归,也不需要合并函数,只需要平面对象上的方法。
我需要能够在运行时合并两个(非常简单)JavaScript对象。例如,我想:
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }
obj1.merge(obj2);
//obj1 now has three properties: food, car, and animal
是否有一种内置的方法来实现这一点?我不需要递归,也不需要合并函数,只需要平面对象上的方法。
当前回答
我使用Object.create()来保持默认设置(使用__proto__或Object.getPrototypeOf())。
function myPlugin( settings ){
var defaults = {
"keyName": [ "string 1", "string 2" ]
}
var options = Object.create( defaults );
for (var key in settings) { options[key] = settings[key]; }
}
myPlugin( { "keyName": ["string 3", "string 4" ] } );
这样我以后就可以一直使用“concat()”或“push()”。
var newArray = options['keyName'].concat( options.__proto__['keyName'] );
注意:为了避免重复,需要在连接之前进行hasOwnProperty检查。
其他回答
**使用Object.assign或排列合并对象很简单。。。操作员**
var obj1={food:“pizza”,car:“ford”}var obj2={animal:“狗”,car:“宝马”}var obj3={a:“a”}var mergedObj=对象赋值(obj1、obj2、obj3)//或使用Spread操作符(…)var mergedObj={…obj1,…obj2,…obj3}console.log(mergedObj);
对象从右向左合并,这意味着与右侧对象具有相同财产的对象将被覆盖。
在此示例中,obj2.car覆盖obj1.car
对于不太复杂的对象,可以使用JSON:
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog', car: 'chevy'}
var objMerge;
objMerge = JSON.stringify(obj1) + JSON.stringify(obj2);
// {"food": "pizza","car":"ford"}{"animal":"dog","car":"chevy"}
objMerge = objMerge.replace(/\}\{/, ","); // \_ replace with comma for valid JSON
objMerge = JSON.parse(objMerge); // { food: 'pizza', animal: 'dog', car: 'chevy'}
// Of same keys in both objects, the last object's value is retained_/
请注意,在此示例中,“}{”不能出现在字符串中!
使用Undercore.js,要合并对象数组,请执行以下操作:
var arrayOfObjects = [ {a:1}, {b:2, c:3}, {d:4} ];
_(arrayOfObjects).reduce(function(memo, o) { return _(memo).extend(o); });
结果是:
Object {a: 1, b: 2, c: 3, d: 4}
gossi对David Coallier方法的扩展:
检查这两行:
from = arguments[i];
Object.getOwnPropertyNames(from).forEach(function (name) {
需要针对空对象检查“from”。。。例如,如果合并以前在服务器上创建的来自Ajax响应的对象,则对象属性的值可以为“null”,在这种情况下,上述代码会生成一个错误消息:
“from”不是有效对象
因此,例如,将“…Object.getOwnPropertyNames(from).forEach…”函数包装为“if(from!=null){…}”将防止发生该错误。
在YUI Y.merge中,应完成以下工作:
Y.merge(obj1, obj2, obj3....)