我有一个学生数组,如下所示
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;
}
})
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
返回数组中满足测试函数的第一个元素的索引。
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将导致它在匹配完成后终止。