给定两个对象,如何在不覆盖obj1中的类似键的情况下将值从obj2复制到obj1?

时间:2017-02-04 20:08:27

标签: javascript ecmascript-6

我有两个对象obj1和obj2。 我正在尝试将obj2中的属性添加到obj1,而不会覆盖类似的属性

到目前为止,这是我的代码:

var obj1 = {
  a: 1,
  b: 2
};
var obj2 = {
  b: 4,
  c: 3
};

function extend(objOne, objTwo) {
  objOne = Object.assign(objOne,objTwo)
  return objOne
}


extend(obj1, obj2)

console.log('obj1:', obj1)
console.log('obj2:', obj2)

Here's the result I'm having : 
// obj1: { a: 1, b: 4, c: 3 }
// obj2: { b: 4, c: 3 }

I'm almost there, but as you can see the `b` value in obj1 
is being overwritten by the `b`value from obj2  

my desired result would be :
// obj1: { a: 1, b: 2, c: 3 }
// obj2: { b: 4, c: 3 }

I tried using the spread operator but with no success

4 个答案:

答案 0 :(得分:2)

您可以使用空对象并在Object.assign中切换对象的顺序。

然后使用新对象进行obj1的分配。



var obj1 = { a: 1, b: 2 },
    obj2 = { b: 4, c: 3 };

Object.assign(obj1, Object.assign({}, obj2, obj1));
console.log(obj1); // { a: 1, b: 2, c: 3 }
console.log(obj2); // { b: 4, c: 3 }




答案 1 :(得分:1)

也许尝试将objOne中的属性添加到objTwo,thew将从objOne重写objTwo中的道具

function extend(objOne, objTwo) {
  newObj = Object.assign(objTwo,objOne)
  return newObj
}

答案 2 :(得分:1)

我可以看到其他答案是正确的。但我假设您要保留关键订单。那么这可能是解决方案:

function extend(objOne, objTwo) {
      Object.assign(objOne, Object.assign({},objTwo, objOne));
      return objOne;
} 

obj1 = extend(obj1,obj2);

console.log('obj1:', obj1); // { a: 1, b: 2, c: 3 }
console.log('obj1:', obj2); // { b: 4, c: 3 }

以下是jsfiddle链接:https://jsfiddle.net/5xufsg7j/1/

答案 3 :(得分:1)

似乎Object.assign()没有完全按照你想要的那样做(防止覆盖已经存在的目标属性)并且你想直接修改现有对象而不是创建一个新对象,所以真的没问题制作自己的功能:

function extend(target, source) {
   for (var prop in source) { 
      if (source.hasOwnProperty(prop) && !target.hasOwnProperty(prop)) {
          target[prop] = source[prop];
      }
   }
   return target;
}