如何过滤对象数组并基于指定属性获取去重结果
更简洁的实现方案
你原有代码需要两次遍历数组,可通过以下两种方式简化:
方案1:单次reduce实现(性能最优)
仅遍历一次数组,同时完成过滤、去重逻辑,最终结果和你的原有实现完全一致:
// 原始数组建议单独命名,避免和结果变量混淆 const data = [{ "Class": "Class C", "Group": "Group A", "Value": 1 }, { "Class": "Class C", "Group": "Group A", "Value": 2 }, { "Class": "Class A", "Group": "Group B", "Value": 2 }, { "Class": "Class C", "Group": "Group B", "Value": 10 } ]; const result = [...data.reduce((map, { Class, Group, Value }) => { Class.includes('Class C') && map.set(Group, { Class, Group, Value }); return map; }, new Map()).values()]; console.log(result);
如果需要保留同Group下第一个出现的项,仅需修改set逻辑:
if (Class.includes('Class C') && !map.has(Group)) { map.set(Group, { Class, Group, Value }) }
方案2:链式调用实现(可读性更高)
逻辑分层更清晰,适合小数据量场景:
const result = [...new Map( data.filter(item => item.Class.includes('Class C')) .map(item => [item.Group, item]) ).values()];
两种方案的结果都和你现有实现完全一致,可根据场景选择。
内容的提问来源于stack exchange,提问作者nad
相关产品推荐
相关产品推荐

