如何在JavaScript中基于选中对象过滤关联数组?
问题:如何遍历对象的damaged数组,基于选中对象过滤出包含关联车辆的目标数组?
我需要基于选中的对象过滤出目标数组,尝试用.map加条件但输出了多余条目。以下是代码片段:
const inventory = [{ name: 'Jeep', id: '100', damaged: [{ name: 'Wrangler', id: '200' }, { name: 'Sahara', id: '201' } ] }, { name: 'Audi', id: '101', damaged: [{ name: 'Q3', id: '300' }] }] const purchasedCars = [{ car: 'Jeep', id: '100' }, { car: 'Jeep - Wrangler', id: '200', }, { car: 'Jeep - Sahara', id: '201' }, { car: 'Audi - Q3', id: '300' } ] const selectedCar = purchasedCars[0]; const filterCars = () => { const result = purchasedCars.filter((inv) => inv.id === selectedCar.id) console.log('result -->', result); } filterCars();
当前filterCars仅返回选中的单个条目,期望输出:
[ { car: 'Jeep', id: '100' }, { car: 'Jeep - Wrangler', id: '200', }, { car: 'Jeep - Sahara', id: '201' } ]
解决方案
核心思路是:先通过选中车辆的id找到inventory中对应的主车辆,收集主车辆+其所有损坏车辆的id集合,再用这个集合去purchasedCars中过滤出目标数组。
修改后的filterCars函数如下:
const filterCars = () => { // 找到选中车辆对应的inventory主条目 const targetInventory = inventory.find(item => item.id === selectedCar.id); if (!targetInventory) return []; // 处理未找到目标的边界情况 // 收集需要保留的所有id:主车辆id + 关联损坏车辆的id const keepIds = new Set([ targetInventory.id, ...targetInventory.damaged.map(dmg => dmg.id) ]); // 过滤出符合条件的车辆 const result = purchasedCars.filter(car => keepIds.has(car.id)); console.log('result -->', result); return result; } filterCars();
逻辑说明:
- 用
inventory.find()快速定位主库存条目,避免重复遍历数组 - 用
Set存储目标id,让后续的存在性判断更高效 - 展开
damaged数组的id到集合中,结合主车辆id得到完整的目标id集合 - 最后通过
filter()筛选出purchasedCars中符合条件的条目
如果需要支持选中损坏车辆时也能返回整个系列的场景,可以调整逻辑:
const filterCars = () => { let targetInventory; // 先检查是否是主车辆 targetInventory = inventory.find(item => item.id === selectedCar.id); if (!targetInventory) { // 若选中的是损坏车辆,找到对应的主车辆 targetInventory = inventory.find(item => item.damaged.some(dmg => dmg.id === selectedCar.id) ); } if (!targetInventory) return []; const keepIds = new Set([ targetInventory.id, ...targetInventory.damaged.map(dmg => dmg.id) ]); const result = purchasedCars.filter(car => keepIds.has(car.id)); console.log('result -->', result); return result; } // 测试选中损坏车辆的情况 const selectedCar = purchasedCars[1]; filterCars(); // 同样输出Jeep系列的三个条目
内容的提问来源于stack exchange,提问作者krsna
相关产品推荐
相关产品推荐

