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

如何按指定条件(更高acceptableRate/requiredNumber)去除对象数组重复项

解决按条件保留重复jobId中的最优项问题

问题分析

你当前的代码通过filter()和findIndex()去重时,仅保留了每个jobId第一次出现的项,但无法根据acceptableRate(或requiredNumber)的优先级保留更优的项。原逻辑中findIndex()会返回第一个匹配jobId的索引,导致后续更优的同jobId项被过滤掉。

解决方案

使用reduce()构建一个以jobId为键的对象,遍历数组时逐个比较同jobId项的acceptableRate,保留数值更高的项;如果需要,也可以补充requiredNumber的比较逻辑作为次要条件。最后通过Object.values()提取结果数组。

代码实现

const result = [
  { jobId: 2, requiredNumber: 2, acceptableRate: 80 },
  { jobId: 3, requiredNumber: 3, acceptableRate: 80 },
  { jobId: 4, requiredNumber: 1, acceptableRate: 80 },
  { jobId: 2, requiredNumber: 1, acceptableRate: 95 } 
];

const filteredResult = Object.values(result.reduce((acc, current) => {
  // 若当前jobId未记录,或当前项的acceptableRate更高,则更新为当前项
  if (!acc[current.jobId] || current.acceptableRate > acc[current.jobId].acceptableRate) {
    acc[current.jobId] = current;
  }
  // 可选:当acceptableRate相同时,保留requiredNumber更大的项
  // else if (current.acceptableRate === acc[current.jobId].acceptableRate && current.requiredNumber > acc[current.jobId].requiredNumber) {
  //   acc[current.jobId] = current;
  // }
  return acc;
}, {}));

console.log(filteredResult);

输出结果

[
  { jobId: 2, requiredNumber: 1, acceptableRate: 95 },
  { jobId: 3, requiredNumber: 3, acceptableRate: 80 },
  { jobId: 4, requiredNumber: 1, acceptableRate: 80 }
]

逻辑说明

  1. reduce()遍历原数组,用累加器acc存储每个jobId对应的最优项;
  2. 每次遍历当前项时,判断累加器中是否已有该jobId:
    • 无则直接存入;
    • 有则比较acceptableRate,保留数值更高的项;
  3. 最后用Object.values()将累加器对象转换为数组,得到去重且保留最优项的结果。

内容的提问来源于stack exchange,提问作者Mohamed Khalifa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:41:05