循环遍历一个对象,并从另一个对象设置其值| javascript

时间:2019-04-14 04:24:26

标签: javascript object ecmascript-6

说我有两个对象:

let obj1 = {
  name: 'obj 1',
  id: 1,
  color: "#fff",
  pages: []
}

let obj2 = {
  name: 'obj 2',
  id: 2,
  color: "#ddd"
}

我想编写一个遵循此逻辑“通过obj1循环的函数,如果obj1和obj1具有相同的属性,则用obj2的值更新obj1的属性”

因此结果将返回值obj1:

{
  name: 'obj 2',
  id: 2,
  color: "#ddd",
  pages: []
}

自从我无法forEach或映射对象以来,我在处理对象时遇到了一些问题

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以使用

var a = [obj1,obj2];
 obj1 = Object.assign(...a);

let obj1 = {
  name: 'obj 1',
  id: 1,
  color: "#fff",
  pages: []
}

let obj2 = {
  name: 'obj 2',
  id: 2,
  color: "#ddd"
}
var a = [obj1,obj2];
obj1 = Object.assign(...a);
console.log(obj1)

答案 1 :(得分:1)

您的问题意味着您不想将obj2中不存在的属性从obj1复制到obj1。如果不可能这样(即obj2始终是obj1的子集),那么Object.assign确实是最好的方法。

如果obj2可以具有您不想复制的属性,那么这里是一个简单的for循环:

for (const prop in obj2) {
  if (prop in obj1) {
    obj1[prop] = obj2[prop];
  }
}

这将迭代对象的所有可枚举属性,包括其原型的“继承”属性。

如果要限制对象的 own 属性,可以使用Object.keys

for (const prop of Object.keys(obj2)) {
  if (prop in obj1) {
    obj1[prop] = obj2[prop];
  }
}

请注意,这两种方法都只会复制“正常”属性。 symbols的属性必须通过Object.get​OwnProperty​Symbols进行单独处理。

答案 2 :(得分:0)

您可以像这样使用传播:

let obj1 = {
  name: 'obj 1',
  id: 1,
  color: "#fff",
  pages: []
}

let obj2 = {
  name: 'obj 2',
  id: 2,
  color: "#ddd"
}

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

console.log(obj1);

(这些属性的顺序可能不正确,因为JavaScript对象的属性是无序的。)

您也可以使用Object.assign

let obj1 = {
  name: 'obj 1',
  id: 1,
  color: "#fff",
  pages: []
}

let obj2 = {
  name: 'obj 2',
  id: 2,
  color: "#ddd"
}

obj1 = Object.assign(obj1, obj2);

console.log(obj1);

答案 3 :(得分:0)

这可确保obj1仅从obj2获取更新,而不从任何新属性获取更新:

let obj1 = {
  name: 'obj 1',
  id: 1,
  color: "#fff",
  pages: []
}

let obj2 = {
  name: 'obj 2',
  id: 2,
  color: "#ddd",
  somethingElse: 'will not add this'
}

const result = Object.entries(obj1).reduce((a, c) => {
  a[c[0]] = obj2[c[0]] !== undefined ? obj2[c[0]] : c[1];
  return a;
}, {});

console.log(result);