You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:20:36