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

如何基于RoomId对JSON数组去重并统计重复值,保留其他字段

问题解决:基于RoomId去重并统计数量,保留其他字段

需求:对JSON数组按RoomId去重,累加重复条目的数量(对应Quantity字段),同时保留RoomName、Rate、PostinDate等其他字段,但现有代码无法正确获取RoomName等字段。

原代码问题分析

  1. groupByID函数仅统计了每个RoomId的出现次数,没有存储RoomName、Rate等其他关键字段,导致后续无法获取这些信息。
  2. createArray函数中,遍历的obj是统计次数的对象,本身不存在RoomName属性,自然无法赋值。

修正后的代码

var listobj = [
    {"RoomId": 8195, "RoomName": "S-403 - Standard Room", "Rate": 3000, "Quantity": 1, "PostinDate": "2023-03-31T18:15:00.000Z"},
    {"RoomId": 8196, "RoomName": "S-404 - Standard Room", "Rate": 3000, "Quantity": 1, "PostinDate": "2023-03-31T18:15:00.000Z"},
    {"RoomId": 8195, "RoomName": "S-403 - Standard Room", "Rate": 3000, "Quantity": 1, "PostinDate": "2023-03-31T18:15:00.000Z"},
    // 省略其他重复数据
];

function groupAndSum(arr) {
    const resultMap = {};
    arr.forEach(item => {
        const id = item.RoomId;
        if (resultMap[id]) {
            // 已存在则累加Quantity
            resultMap[id].Quantity += item.Quantity;
            // 如果需要更新PostinDate为最新的,可以在这里处理,比如:
            // resultMap[id].PostinDate = item.PostinDate;
        } else {
            // 不存在则复制当前条目,作为初始数据
            resultMap[id] = {...item};
        }
    });
    // 将Map的值转为数组返回
    return Object.values(resultMap);
}

var resArray = groupAndSum(listobj);
console.log(resArray);

输出结果

运行后会得到符合期望的数组:

[
 {"RoomId": 8195, "RoomName": "S-403 - Standard Room", "Rate": 3000, "Quantity": 9, "PostinDate": "2023-03-31T18:15:00.000Z"},
 {"RoomId": 8196, "RoomName": "S-404 - Standard Room", "Rate": 3000, "Quantity": 9, "PostinDate": "2023-03-31T18:15:00.000Z"}
]

补充说明

  • 代码中使用扩展运算符{...item}复制原对象,避免直接引用导致的原数组数据被修改。
  • 如果需要将PostinDate更新为重复条目中的最新日期,可以在累加Quantity的同时替换该字段的值。

内容的提问来源于stack exchange,提问作者4b0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:42:23