如何更简洁地按name聚合对象数组并保留最高value值?
如何简洁实现按name分组并保留最高value的对象数组归约?
需求明确:将对象数组按name分组,每组仅保留value值最大的对象,同时保留对象的其他属性。
你的现有实现分三步完成逻辑:先按name分组存为对象(值为数组)、遍历分组取最大值、转成最终数组输出,步骤确实可以进一步简化——用一次reduce就能完成所有逻辑,无需额外循环和二次归约。
简洁实现代码
const toReduce = [ { name: 'a', value: 20, other: 'any' }, { name: 'a', value: 80, other: 'value' }, { name: 'b', value: 90, other: 'extra' }, { name: 'b', value: 50, other: 'super' } ]; const arrayReducer = (arr) => { return Object.values(arr.reduce((acc, curr) => { // 无对应name记录,或当前对象value更大时,更新记录 if (!acc[curr.name] || curr.value > acc[curr.name].value) { acc[curr.name] = curr; } return acc; }, {})); }; console.log(arrayReducer(toReduce));
逻辑说明
- 用
reduce遍历原数组,累加器acc是一个以name为键、对应最大value对象为值的临时对象 - 遍历每个对象时:
- 若
acc中无当前name的条目,直接存入当前对象 - 若已有条目,对比两者
value,将值更大的对象保留在acc中
- 若
- 最后通过
Object.values()提取临时对象的所有值,得到目标结果数组
这个方案仅需一次遍历,代码更紧凑,效率也更高,省去了原方案中分组后二次处理的步骤。
内容的提问来源于stack exchange,提问作者caiovisk
相关产品推荐
相关产品推荐

