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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环遍历一个对象,并从另一个对象设置其值JavaScript的相关的知识,希望对你有一定的参考价值。

说我有两个对象:

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

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

谢谢!

答案

您可以使用

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)
另一答案

您的问题意味着您不希望将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单独处理。

另一答案

您可以像这样使用传播:

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);
另一答案

这可以确保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);

以上是关于循环遍历一个对象,并从另一个对象设置其值JavaScript的的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历两个字符串数组并将它们设置为对象属性

在 Reducer 中保存设置并从另一个 Reducer 访问它们?

如何在循环并进行异步承诺调用后获取重新格式化的 json 对象

通过使用按钮设置状态来循环遍历数组中的对象 React

对数组或对象通过循环改变其值产生的bug及解决方式

对数组或对象通过循环改变其值产生的bug及解决方式