在javascript中合并两个对象文字

ajs*_*sie 12 javascript

我有两个对象文字:

var animal = {
    eat: function() {
        console.log("eating...");
    }
}

var dog = {
    eat: "this has to be replaced when merged",
    nrOfLegs: 4
}
Run Code Online (Sandbox Code Playgroud)

需要这样的合并功能:

dog = someMergingFunction(animal, dog);
Run Code Online (Sandbox Code Playgroud)

这产生:

{
    eat: function() {
        console.log("eating...");
    },
    nrOfLegs: 4
}
Run Code Online (Sandbox Code Playgroud)

其中一个对象文字必须替换相同的属性.

我如何在Javascript中执行此操作?

cas*_*nca 12

以下应该有效:

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;
}
Run Code Online (Sandbox Code Playgroud)

如果两个对象具有相同的属性,则值obj2优先.


amb*_*odi 6

我强烈推荐使用jQuery的extend方法,因为它将提供完整的浏览器支持.

var object = $.extend({}, object1, object2, ..., objectN);
Run Code Online (Sandbox Code Playgroud)

请记住,第一个参数是目标.关于extend的使用的好处是,通过以下代码,您可以使其递归扩展:

var object = $.extend(object, object1, object2, ..., objectN);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅jQuery的文档:用于Extend方法的jQuery Docs


isa*_*acs 5

// usage merged = someMergingFunction(a, b, c, d, ...)
// keys in earlier args override keys in later args.
// someMergingFunction({foo:"bar"}, {foo:"baz"})
//  ==> {foo:"bar"}
function someMergingFunction () {
  var o = {}
  for (var i = arguments.length - 1; i >= 0; i --) {
    var s = arguments[i]
    for (var k in s) o[k] = s[k]
  }
  return o
}
Run Code Online (Sandbox Code Playgroud)


Ja *_*Loc 5

扩展语法怎么样?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

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 } 
Run Code Online (Sandbox Code Playgroud)