在javascript中合并两个对象文本
我有两个对象文本:在javascript中合并两个对象文本,javascript,Javascript,我有两个对象文本: var animal = { eat: function() { console.log("eating..."); } } var dog = { eat: "this has to be replaced when merged", nrOfLegs: 4 } 需要这样的合并功能: dog = someMergingFunction(animal, dog); 这将产生: { eat: function() {
var animal = {
eat: function() {
console.log("eating...");
}
}
var dog = {
eat: "this has to be replaced when merged",
nrOfLegs: 4
}
需要这样的合并功能:
dog = someMergingFunction(animal, dog);
这将产生:
{
eat: function() {
console.log("eating...");
},
nrOfLegs: 4
}
其中一个对象文字必须替换相同的属性
如何在Javascript中执行此操作?以下操作应该可以正常工作:
function merge(obj1, obj2) {
var obj = {};
for (var x in obj1)
if (obj1.hasOwnProperty(x))
obj[x] = obj1[x];
for (var x in obj2)
if (obj2.hasOwnProperty(x))
obj[x] = obj2[x];
return obj;
}
如果两个对象具有相同的属性,则
obj2
中的值优先。假设第一个参数的属性将覆盖第二个参数的属性(如您的示例),这将执行以下操作:
function merge(obj1, obj2) {
for(attr in obj1)
obj2[attr]=obj1[attr];
return obj2;
}
这可能是用别克打苍蝇,但你可能有兴趣看看Dojo如何在
Dojo.mixin
中做基本相同的事情(至少如果我理解正确的话)
基本功能在dojo.\u mixin中,而dojo.mixin使其在一次拍摄中对多个对象逐步迭代工作
请注意,
dojo.mixin
的操作方向与您在示例中所暗示的方向相反。我建议使用下划线.js
,因为它包含此功能和一整套相关内容:
_.extend({name : 'moe'}, {age : 50});
=> {name : 'moe', age : 50}
我强烈推荐jQuery的扩展方法,因为它将提供完整的浏览器支持
var object = $.extend({}, object1, object2, ..., objectN);
请记住,第一个参数是目标。使用extend的好处在于,通过以下代码,可以使其递归扩展:
var object = $.extend(object, object1, object2, ..., objectN);
有关更多信息,请参阅jQuery文档:这里有一些很好的建议 我知道这是一个非常古老的问题,但对于未来寻求更灵活解决方案的访问者,我有一个类似的函数,我编写的函数可以接受数组中任意数量的对象,并将它们合并在一起,返回一个具有数组中所有对象文字属性的单个对象 注意:优先顺序由数组决定。如果以前的对象中存在相同的属性,则每个后续对象将覆盖这些属性。否则,只需将新属性添加到返回的单个对象中 我希望这将有助于未来的访问者了解这个问题。下面是函数,非常简短:
var mergeObjects = function (objectsArray) {
var result = {};
for (var i = 0; i < objectsArray.length; i++) {
for (var obj in objectsArray[i]) {
if (objectsArray[i].hasOwnProperty(obj)) {
result[obj] = objectsArray[i][obj];
};
};
};
return result;
};
var mergeObjects=函数(objectsArray){
var result={};
for(var i=0;i
您可以这样使用它:
dog = someMergingFunction(animal, dog);
//定义mergeObjects函数
var mergeObjects=函数(objectsArray){
var result={};
for(var i=0;i ”;
}
}
从2017年起,我将使用扩展语法如何
在您的示例中,
someFunction
如何知道保留哪个eat
,放弃哪个?第一个可能是重写对象文本。因为当你合并两个物体时,一个必须胜过另一个right@Emmett一种选择是假设第二个传递的参数优先于第一个。请花点时间阅读帮助中心中的。堆栈溢出上的格式设置与其他站点不同。我已经更新了这篇文章(其他人也在过去更新过),但请在将来帮助我们正确格式化你的文章。请注意。此方法在ES6中可用,ES5用户需要从上面使用旧样式。
var obj1 = { foo: 'bar', x: 42 };
var obj2 = { foo: 'baz', y: 13 };
var clonedObj = { ...obj1 };
// Object { foo: "bar", x: 42 }
var mergedObj = { ...obj1, ...obj2 };
// Object { foo: "baz", x: 42, y: 13 }