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

问题描述 投票:1回答:4

说我有两个对象:

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: []
}

我有一个处理对象的问题,因为我不能每次或映射它们

谢谢!

javascript object ecmascript-6
4个回答
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
投票

您的问题意味着您不希望将obj2中的属性复制到obj1中不存在的obj1。如果情况永远不会如此(即obj2总是obj1的一个子集),那么Object.assign确实是最好的方式。

如果obj2可以拥有你不想复制的属性,这里只是一个简单的for循环:

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

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

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

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

请注意,任一方法都只会复制“普通”属性。属于symbols的属性必须通过Object.get​OwnProperty​Symbols单独处理。


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);

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);
© www.soinside.com 2019 - 2024. All rights reserved.