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

如何更简洁地按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));

逻辑说明

  1. 用reduce遍历原数组,累加器acc是一个以name为键、对应最大value对象为值的临时对象
  2. 遍历每个对象时:
    • 若acc中无当前name的条目,直接存入当前对象
    • 若已有条目,对比两者value,将值更大的对象保留在acc中
  3. 最后通过Object.values()提取临时对象的所有值,得到目标结果数组

这个方案仅需一次遍历,代码更紧凑,效率也更高,省去了原方案中分组后二次处理的步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:02:40