如何按指定条件(更高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 } ]
逻辑说明
reduce()遍历原数组,用累加器acc存储每个jobId对应的最优项;- 每次遍历当前项时,判断累加器中是否已有该
jobId:- 无则直接存入;
- 有则比较
acceptableRate,保留数值更高的项;
- 最后用
Object.values()将累加器对象转换为数组,得到去重且保留最优项的结果。
内容的提问来源于stack exchange,提问作者Mohamed Khalifa
相关产品推荐
相关产品推荐

