如何从对象数组中筛选出每个name对应power值最高的唯一一项?
实现对象数组按指定字段分组取最大值的方案
你可以通过临时映射对象的方式实现需求,不需要反复查询正在构建的结果数组,逻辑简单易读:
实现代码
const items = [ {name: "john", power: 1}, {name: "john", power: 129391}, {name: "john", power: 91}, {name: "philip", power: 33}, {name: "philip", power: 883}, {name: "philip", power: 3112333}, ]; // 用普通对象做临时存储,key为name,value为当前name对应power最大的条目 const tempMap = {} for (const item of items) { // 同name下如果是首次存入,或者当前条目power更大,就替换缓存内容 if (!tempMap[item.name] || item.power > tempMap[item.name].power) { tempMap[item.name] = item } } // 把缓存对象的值转为数组就是最终结果 const result = Object.values(tempMap)
你也可以用reduce方法实现更简洁的写法,逻辑和上面完全一致:
const result = Object.values( items.reduce((acc, item) => { if (!acc[item.name] || item.power > acc[item.name].power) acc[item.name] = item return acc }, {}) )
输出结果
[ { name: 'john', power: 129391 }, { name: 'philip', power: 3112333 } ]
内容的提问来源于stack exchange,提问作者Passaro
相关产品推荐
相关产品推荐

