如何按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完全一致
逻辑说明
- 分组存储:用
reduce遍历原数组,以label为键把对象存入累加器对象acc - 累加data元素:如果当前label已存在,就遍历data数组,将对应索引的元素相加后更新
- 转成目标数组:用
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
相关产品推荐
相关产品推荐

