如何将此对象的属性添加到另一个对象?

时间:2017-02-03 01:44:12

标签: javascript

鉴于

var obj1 = {
  a: 'cat'
  b: 'dog'
};
var obj2 = {
  b: 'dragon'
  c: 'cow'
};

如何在不覆盖obj2的情况下将obj1的属性添加到obj1。输出应该像console.log(obj1) => {a: 'cat', b: 'dog', c: 'cow'}console.log(obj2) => {b: 'dragon', c: 'cow'}

3 个答案:

答案 0 :(得分:2)

只需先检查它是否存在,是否不添加它!

for (key in obj2) {
    if (!obj1[key]) obj1[key] = obj2[key]
}

正如RobG在评论中指出的那样,如果您的值是假的(0,false,undefined,null,''等等),这将不起作用,它将跳过它们。如果你总是使用字符串,就像在你的例子中一样,那就没问题了,但你也可以安全和全面:

for (key in obj2) {
    if (!(obj1.hasOwnProperty(key))) {
        obj1[key] = obj2[key]
    }
}

答案 1 :(得分:1)

解决方案:

obj1 = {...obj2, ...obj1};

此解决方案仅在您知道预期值可能是多少时才有效,例如:你知道它们都是非空字符串。这使用对象扩展语法。您需要确保最后包含obj1。你可能需要一个像babel这样的转换器,直到所有的浏览器(IE ......)都赶上来。



let obj1 = {
  a: 'cat',
  b: 'dog'
};
let obj2 = {
  b: 'dragon',
  c: 'cow'
};
obj1 = {...obj2, ...obj1};
console.log('obj1:', obj1);
console.log('obj2:', obj2);




答案 2 :(得分:0)

要将属性从一个对象复制到另一个对象,请 Object.assign 。但是,如果源上存在同名的属性,它将覆盖目标对象的值。

您可以创建一个 assignSoft 方法,该方法不会覆盖现有属性的值。以下内容基于MDN的Object.assign polyfill。它似乎有点长,因为它尽可能地为 Object.assign 实现了ECMAScript算法。

此外,与内置的 Object.assign 一样,这只是一个"浅"复制,以便不复制对象值,分配引用。



if (typeof Object.assignSoft != 'function') {
  Object.assignSoft = function(target, varArgs) { // .length of function is 2
    'use strict';
    if (target == null) { // TypeError if undefined or null
      throw new TypeError('Cannot convert undefined or null to object');
    }

    var to = Object(target);

    for (var index = 1; index < arguments.length; index++) {
      var nextSource = arguments[index];

      if (nextSource != null) { // Skip over if undefined or null
        for (var nextKey in nextSource) {

          // Avoid bugs when hasOwnProperty is shadowed
          // Don't copy if property exists on target
          if (Object.prototype.hasOwnProperty.call(nextSource, nextKey) && !Object.prototype.hasOwnProperty.call(to, nextKey)) {
            to[nextKey] = nextSource[nextKey];
          }
        }
      }
    }
    return to;
  };
}

var obj = Object.assignSoft({a:'a',b:'b'},{b:'bb',c:'c'});

console.log(obj); // {a:'a',b: 'b',c:'c'}
&#13;
&#13;
&#13;

更紧凑(尽管不那么严格)的版本只需要一个源对象。要添加对多个源的支持,请迭代传入的参数。

&#13;
&#13;
if (!Object.assignSoft) {
  Object.assignSoft = function(target, source) {
    Object.keys(source).forEach(function(key){
      if (!target.hasOwnProperty(key)) {
        target[key] = source[key];
      }
    });
    return target;
  }
}

var obj = Object.assignSoft({a:'a',b:'b'},{b:'bb',c:'c'});

console.log(obj); // {a:'a',b: 'b',c:'c'}
&#13;
&#13;
&#13;