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

问题描述 投票:0回答:2

在javascript中,我有以下两个对象数组

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

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

当id与对象的第二个数组匹配时,我想在对象的第一个数组中只将该id的值(属性)设置为0。就像下面,一旦123这个id在两个数组中都匹配,那么data1数组应该是这样的。

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

如何实现上述方案?

javascript arrays
2个回答
1
投票

你可以将data2的id保存在一个名为 "data2 "的文件中。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)

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

0
投票

你可以把第二个数组中的所有对象id做成一组,用一个 new Set(),然后 .map() 你的第一个数组变成新的对象,改变 value 属性,如果对象的id在集合内(用 .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);
© www.soinside.com 2019 - 2024. All rights reserved.