如何基于RoomId对JSON数组去重并统计重复值,保留其他字段
问题解决:基于RoomId去重并统计数量,保留其他字段
需求:对JSON数组按RoomId去重,累加重复条目的数量(对应Quantity字段),同时保留RoomName、Rate、PostinDate等其他字段,但现有代码无法正确获取RoomName等字段。
原代码问题分析
groupByID函数仅统计了每个RoomId的出现次数,没有存储RoomName、Rate等其他关键字段,导致后续无法获取这些信息。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
相关产品推荐
相关产品推荐

