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

如何合并数组中eventId相同的对象,将selectedNumber转为数组?

合并相同eventId对象的selectedNumber值

问题描述

我有一个包含eventId和selectedNumber键的数组,数组中存在多个eventId相同但selectedNumber值不同的对象。我希望将其转换为每个对象拥有唯一eventId,且对应selectedNumber为同eventId下所有值组成的数组的结构。我尝试使用lodash的_.groupBy()方法,但它仅将对象按eventId分组为数组,不符合需求,请问该如何实现?

输入示例

[
{
  "eventId" : "636939dde9341f2fbbc7256e",
  "selectedNumber" : "20"
},
{
  "eventId" : "636939dde9341f2fbbc7256e",
  "selectedNumber" : "30"
},
{
  "eventId" : "63693a55e9341f2fbbc725c0",
  "selectedNumber" : "50"
}
]

期望输出

[
{
  "eventId" : "636939dde9341f2fbbc7256e",
  "selectedNumber" : ["20", "30"]
},
{
  "eventId" : "63693a55e9341f2fbbc725c0",
  "selectedNumber" : "50"
}
]

解决方案

方法一:原生JavaScript实现

用Array.reduce()遍历数组,以eventId为键缓存中间结果,最后把缓存对象转成数组即可:

const input = [
  { eventId: "636939dde9341f2fbbc7256e", selectedNumber: "20" },
  { eventId: "636939dde9341f2fbbc7256e", selectedNumber: "30" },
  { eventId: "63693a55e9341f2fbbc725c0", selectedNumber: "50" }
];

const result = Object.values(input.reduce((acc, item) => {
  if (!acc[item.eventId]) {
    acc[item.eventId] = {
      eventId: item.eventId,
      selectedNumber: []
    };
  }
  acc[item.eventId].selectedNumber.push(item.selectedNumber);
  // 单个值时转为字符串,多个值保留数组
  if (acc[item.eventId].selectedNumber.length === 1) {
    acc[item.eventId].selectedNumber = acc[item.eventId].selectedNumber[0];
  }
  return acc;
}, {}));

console.log(result);

方法二:基于Lodash优化实现

你已经用到了_.groupBy(),只需要在分组后再对每个分组做一次转换,提取selectedNumber并处理格式:

const _ = require('lodash');

const input = [
  { eventId: "636939dde9341f2fbbc7256e", selectedNumber: "20" },
  { eventId: "636939dde9341f2fbbc7256e", selectedNumber: "30" },
  { eventId: "63693a55e9341f2fbbc725c0", selectedNumber: "50" }
];

// 先按eventId分组
const grouped = _.groupBy(input, 'eventId');

// 转换分组结果
const result = Object.entries(grouped).map(([eventId, items]) => {
  const numbers = items.map(item => item.selectedNumber);
  return {
    eventId,
    selectedNumber: numbers.length === 1 ? numbers[0] : numbers
  };
});

console.log(result);

两种方法都能得到你想要的结构,原生方法无需额外依赖,Lodash的方式更简洁直观,可根据项目环境选择使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:15:50