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

如何按label合并对象数组并聚合对应data数组元素

按Label合并对象数组并累加Data数组对应元素

你可以用Array.prototype.reduce()来高效实现这个需求,核心思路是先按label分组,再对每组的data数组对应位置元素求和,最后转成目标数组。

实现代码

const originalArray = [
    { label: "approved", data: [1, 0, 0, 0, 0, 0, 0] },
    { label: "approved", data: [0, 2, 0, 0, 0, 0, 0] },
    { label: "rejected", data: [0, 0, 3, 0, 0, 0, 0] },
    { label: "rejected", data: [0, 0, 0, 1, 0, 0, 0] },
    { label: "pending", data: [0, 1, 0, 0, 0, 0, 0] },
    { label: "pending", data: [0, 0, 0, 0, 0, 7, 0] }
];

const mergedArray = Object.values(originalArray.reduce((acc, current) => {
    if (acc[current.label]) {
        // 对应位置元素相加
        acc[current.label].data = acc[current.label].data.map((val, idx) => val + current.data[idx]);
    } else {
        // 首次出现的label,浅拷贝对象和数组避免修改原数据
        acc[current.label] = { ...current, data: [...current.data] };
    }
    return acc;
}, {}));

console.log(mergedArray);
// 输出结果与你的expectedArray完全一致

逻辑说明

  1. 分组存储:用reduce遍历原数组,以label为键把对象存入累加器对象acc
  2. 累加data元素:如果当前label已存在,就遍历data数组,将对应索引的元素相加后更新
  3. 转成目标数组:用Object.values()把累加器中的值提取出来,得到最终的合并数组

扩展处理(可选)

如果你的data数组长度可能不一致,可以补充处理逻辑,确保短数组自动补0后再相加:

const mergedArray = Object.values(originalArray.reduce((acc, current) => {
    if (acc[current.label]) {
        const targetData = acc[current.label].data;
        const currentData = current.data;
        const maxLen = Math.max(targetData.length, currentData.length);
        
        // 补全短数组的0
        while (targetData.length < maxLen) targetData.push(0);
        while (currentData.length < maxLen) currentData.push(0);
        
        // 对应位置相加
        acc[current.label].data = targetData.map((val, idx) => val + currentData[idx]);
    } else {
        acc[current.label] = { ...current, data: [...current.data] };
    }
    return acc;
}, {}));

内容的提问来源于stack exchange,提问作者darda-veostr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:47:32