如何为cars数组中匹配car_id的对象添加hasinsurance:true属性?
问题分析与解决方法
你的代码问题出在两点:
- 用错了数组方法:
filter的作用是过滤数组并返回符合条件的新数组,不是用来遍历执行修改对象属性这类操作的,应该用forEach或者直接遍历数组。 - 内层循环覆盖了结果:内层的
insurances.filter会遍历所有保险项,哪怕某个车辆ID之前匹配到过并设为true,后面不匹配的保险项会把hasinsurance重新设为false。比如ID为1的车,第一个保险项匹配成功设为true,但第二个保险项的car_id是3,不匹配,又把它改成false,最终所有车辆的属性都变成了false。
正确解法
先把所有有保险的车辆ID提取到一个集合(Set)里,这样判断ID是否存在的效率更高,再遍历车辆数组添加属性:
var cars = [{id: 1, brand: "VW"},{id: 2, brand: "BMW"}]; var insurances = [{insurance: 'Allianz', car_id: 1}, {insurance: 'DKV', car_id: 3}]; // 提取所有有保险的car_id到Set中 const insuredCarIds = new Set(insurances.map(item => item.car_id)); // 遍历车辆数组添加属性 cars.forEach(car => { car.hasinsurance = insuredCarIds.has(car.id); }); console.log(cars); // 输出: [{id: 1, brand: "VW", hasinsurance: true}, {id: 2, brand: "BMW", hasinsurance: false}]
如果不想修改原数组,也可以用map返回新数组:
const carsWithInsurance = cars.map(car => ({ ...car, hasinsurance: insuredCarIds.has(car.id) }));
内容的提问来源于stack exchange,提问作者beli3ver
相关产品推荐
相关产品推荐

