如何比较两个数组并在id匹配的情况下更改名称?

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

我有一个学生数组,如下所示

student=[{id:1,name:'Sam',age:23},{id:2,name:'Jolia',age:23},{id:3,name:'Peter',age:23}]

我还有另一个包含了一些学生的最新年龄值,比如下面的例子。

updated=[{id:2,age:25},{id:3,age:21}]

在本例中,我想通过这两个数组的Id找到交叉点,然后用更新后的数组改变学生数组的年龄值。

预期结果

 student=[{id:1,name:'Sam',age:23},{id:2,name:'Jolia',age:25},{id:3,name:'Peter',age:21}]

id:2和id:3的值发生了变化,因为update包括这些id值。

我试着用map来迭代两个数组,但没有成功,而且我觉得不合理。

updated.map(e=>{
   if(e.id==student.map(j=>{j.id})){
     e.age=j.age;
   }
 }) 
javascript
1个回答
1
投票

let updated=[{id:2,age:25},{id:3,age:21}];
let student=[{id:1,name:'Sam',age:23},{id:2,name:'Jolia',age:23},{id:3,name:'Peter',age:23}];
student.forEach(e =>{
  let idx = updated.findIndex(u => u.id == e.id);
  if(idx >=0) {
      e.age = updated[idx].age;
  }
});

console.log(student);

你可以使用 forEach 而不是 map() 对于这个场景。遍历所有学生,如果id匹配,则根据更新数组更新年龄。findIndex 返回数组中满足测试函数的第一个元素的索引。


1
投票

var student=[{id:1,name:'Sam',age:23},{id:2,name:'Jolia',age:23},{id:3,name:'Peter',age:23}];
var updated=[{id:2,age:25},{id:3,age:21}];

updated.forEach(delta => {
  student.forEach(record => {
    if (delta.id === record.id) {
      record.age = delta.age;
      return false;
    }
  });
});

console.log(student);

你可以使用simple for each逻辑来迭代更新每个元素。 在内部的forEach中返回false将导致它在匹配完成后终止。

© www.soinside.com 2019 - 2024. All rights reserved.