如何合并数组中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
相关产品推荐
相关产品推荐

