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

是否存在合并具有相同键的对象的函数?附当前与期望输出示例

合并具有相同userid的对象数组解决方案

当然有办法实现这个需求!我们可以利用JavaScript的数组方法轻松搞定,下面是具体的实现步骤和代码:

原始数据与期望结果

先明确我们的输入和目标输出:

// 原始响应数据
const originalData = [ 
  { "userid": 1, "Jun": 1 }, 
  { "userid": 2, "Jun": 2 }, 
  { "userid": 2, "Jul": 5 }, 
  { "userid": 2, "Jan": 1 } 
];

// 你期望得到的结果(注:你给出的期望结果中userid=2的Jun值为1,但原始数据对应值是2,下面的代码会按原始数据的属性值合并)
const expectedData = [ {"userid": 1, "Jun": 1}, {"userid": 2, "Jun": 2, "Jul": 5, "Jan": 1} ];

核心实现代码

const mergedData = Object.values(originalData.reduce((accumulator, currentObj) => {
  // 提取当前对象的userid作为分组标识
  const userId = currentObj.userid;
  
  // 如果分组中还没有该userid的记录,先初始化一个包含userid的对象
  if (!accumulator[userId]) {
    accumulator[userId] = { userid: userId };
  }
  
  // 将当前对象的所有属性合并到对应的分组对象中
  Object.assign(accumulator[userId], currentObj);
  
  return accumulator;
}, {}));

console.log(mergedData);

逻辑说明

  1. reduce分组:用reduce遍历原始数组,借助一个累加器对象按userid分组存储数据。
  2. 初始化分组条目:如果累加器里还没有当前userid的记录,就先创建一个仅包含userid的基础对象。
  3. 合并属性:用Object.assign把当前对象的所有属性合并到对应分组中,若存在重复属性(比如同一userid下的相同月份键),后面的属性值会覆盖前面的。
  4. 转换为数组:最后用Object.values把累加器中的分组对象提取出来,转换成我们需要的数组格式。

如果你的实际需求是对相同月份的数值进行求和(比如你期望userid=2的Jun值为1可能是求和场景?),只需要调整合并逻辑即可:

// 求和版本的合并逻辑
const mergedDataWithSum = Object.values(originalData.reduce((acc, current) => {
  const userId = current.userid;
  if (!acc[userId]) {
    acc[userId] = { userid: userId };
  }
  // 遍历当前对象的非userid属性,进行累加求和
  Object.keys(current).forEach(key => {
    if (key !== 'userid') {
      acc[userId][key] = (acc[userId][key] || 0) + current[key];
    }
  });
  return acc;
}, {}));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:07:43