Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中合并两个对象文本_Javascript - Fatal编程技术网

在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 }