我需要能够在运行时合并两个(非常简单)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
是否有一种内置的方法来实现这一点?我不需要递归,也不需要合并函数,只需要平面对象上的方法。
当前回答
有三种方法可以做到这一点:-
方法1:-
// using spread ...
let obj1 = {
...obj2
};
方法2:-
// using Object.assign() method
let obj1 = Object.assign({}, obj2);
方法3:-
// using JSON
let obj1 = JSON.parse(JSON.stringify(obj2));
其他回答
以下两个可能是一个很好的起点。lodash还为那些特殊需求提供定制功能!
_.延伸(http://underscorejs.org/#extend) _.合并(https://lodash.com/docs#merge)
我刚开始使用JavaScript,所以如果我错了,请纠正我。
但如果可以合并任意数量的对象,不是更好吗?下面是我如何使用本机Arguments对象实现的。
关键在于,实际上可以向JavaScript函数传递任意数量的参数,而无需在函数声明中定义它们。如果不使用Arguments对象,就无法访问它们。
function mergeObjects() (
var tmpObj = {};
for(var o in arguments) {
for(var m in arguments[o]) {
tmpObj[m] = arguments[o][m];
}
}
return tmpObj;
}
对于不太复杂的对象,可以使用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_/
请注意,在此示例中,“}{”不能出现在字符串中!
对于使用Node.js的用户,有一个NPM模块:Node.extend
安装:
npm install node.extend
用法:
var extend = require('node.extend');
var destObject = extend(true, {}, sourceObject);
// Where sourceObject is the object whose properties will be copied into another.
请注意,underline.js的extend方法在一行中实现了这一点:
_.extend({name : 'moe'}, {age : 50});
=> {name : 'moe', age : 50}