如何在JavaScript中通过比较两个对象数组来更新特定属性?

5

我有以下两个JavaScript对象数组

data1 = [
  {
    id: 123,
    option: "ABC",
    value: "123"
  },
  {
    id: 234,
    option: "DFG",
    value: "234"
  }
];

data2 = [
  {
    id: 123,
    option: "ABC",
    value: "123"
  }
];

当id与第2个对象数组匹配时,我想要将该特定id仅在第1个对象数组中的值(属性)设置为0。 就像下面一样,一旦id 123在两个数组中都匹配,则data1数组应如下所示

data1 = [
  {
    id: 123,
    option: "ABC",
    value: "0"
  },
  {
    id: 234,
    option: "DFG",
    value: "234"
  }
];

如何实现上述场景?
3个回答

2
你可以将data2的id保存在一个Set中,并迭代data1,如果其id在该集合中,则更改每个项的值:

let data1 = [{ id: 123, option: 'ABC', value: "123" }, { id: 234, option: "DFG", value: "234" } ];
let data2 = [{ id: 123, option: 'ABC', value: "123" } ];
let set = new Set();
for(let i = 0; i < data2.length; i++)
     set.add(data2[i]['id'])
for(let i = 0; i < data1.length; i++)
     if(set.has(data1[i]['id']))
          data1[i]['value'] = 0;
console.log(data1)


1
你可以使用 new Set() 从第二个数组中创建一个所有对象 id 的集合,然后使用 .map() 对第一个数组进行映射到新的对象上,并在对象的 id 在集合中时更改 value 属性(通过使用 .has() 进行检查):

const data1 = [{ id: 123, option: 'ABC', value: "123" }, { id: 234, option: "DFG", value: "234" } ];
const data2 = [{ id: 123, option: 'ABC', value: "123" }];

const idSet = new Set(data2.map(o => o.id));
const res = data1.map(o => ({...o, value: idSet.has(o.id) ? "0" : o.value}));
console.log(res);


0

你可以使用 foreach,这将改变你的第一个数组,这正是你所需要的,或者你也可以使用 map(但它会生成新的数组):

var data1 = [{ id: 123, option: 'ABC', value: "123" }, { id: 234, option: "DFG", value: "234" } ];
var data2 = [ { id: 123, option: 'ABC', value: "123" } ];

data1.forEach(k=>{
  ispresent = data2.find(p=>p.id==k.id);
  if(ispresent) k.value = '0'
});

console.log(data1);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接