是否存在合并具有相同键的对象的函数?附当前与期望输出示例
合并具有相同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);
逻辑说明
reduce分组:用reduce遍历原始数组,借助一个累加器对象按userid分组存储数据。- 初始化分组条目:如果累加器里还没有当前
userid的记录,就先创建一个仅包含userid的基础对象。 - 合并属性:用
Object.assign把当前对象的所有属性合并到对应分组中,若存在重复属性(比如同一userid下的相同月份键),后面的属性值会覆盖前面的。 - 转换为数组:最后用
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
相关产品推荐
相关产品推荐

