从其他对象获取数组属性和值

时间:2017-05-27 02:16:34

标签: javascript

嘿伙计们我需要创建一个函数,将第二个对象的属性添加到第一个对象。如果第一个对象已经有给定键,则忽略它(它不能覆盖属性值)。它根本不能修改第二个对象。

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

function extend(obj1, obj2) {
  if(obj1.keys !== obj2.keys){
    obj1 = {
      obj2.keys;
    }
  }
}

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

extend(obj1, obj2);

console.log(obj1); // --> IT MUST RETURN {a: 1, b: 2, c: 3}
console.log(obj2); // --> IT MUST RETURN {b: 4, c: 3}

知道我做错了什么吗?

2 个答案:

答案 0 :(得分:0)

  • 循环浏览obj2
  • 的所有属性
  • 对于每个属性,请确保1)obj1上的密钥尚不存在; 2)密钥存在于obj2本身而不是其原型链上的某个位置
  • 如果满足以上测试,则将属性添加到obj1


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

答案 1 :(得分:0)

"我做错了什么?"

首先:obj1obj2在表达状态中不会有属性keys,因此尝试比较它们是不可能的;您if(obj1.keys !== obj2.keys)实际上在做的是询问undefined !== undefined

其次:对象和数组(我认为这是你希望的obj*.keys)比较不能像我们比较字符串或数字那样进行。

您可能误解了如何使用Object.keys来比较它们。有关启示,请参阅this documentation

每个键可以与另一个键进行比较,但是我们无法将一个组中的所有键与一个组中的所有键进行比较。通常,我们会使用某种形式的循环来完成它们。

Object.assign()

在JavaScript中有many ways to loop through objects and arrays,但我们也可以use Object.assign() to merge objects

  

Object.assign()方法用于将所有可枚举的自有属性的值从一个或多个源对象复制到target对象。它将返回target对象。

     

<强>语法
  Object.assign(target, ...sources)

在下面的示例中,我们obj2合并为obj1targetobj1变为{a: 1, b: 4, c: 3} 。相反,我们创建一个新的对象文字并将其作为target提供,然后将其从返回值中分配为obj1的新值。
obj2仍未受影响。

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

obj1 = Object.assign( {}, obj2, obj1 );

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

...

很快(在发布时)看到使用spread in object literals合并的对象将是共同的:

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

但是在这个问题的特定情况下,结果可能并不理想。