如何修正代码实现按item分组Booking对象并添加重复计数?
问题分析与代码修正
原始数据示例
[ { "userId": "user1", "Bookings": [ { "BookingID": "b1", "item": "laptop", "date": "2024-01-01" }, { "BookingID": "b2", "item": "laptop", "date": "2024-01-02" }, { "BookingID": "b3", "item": "phone", "date": "2024-01-01" } ] }, { "userId": "user2", "Bookings": [ { "BookingID": "b4", "item": "tablet", "date": "2024-01-03" }, { "BookingID": "b5", "item": "laptop", "date": "2024-01-04" }, { "BookingID": "b6", "item": "tablet", "date": "2024-01-05" } ] } ]
问题代码(错误原因:用整个Booking对象作为Map键)
function groupArray(users) { return users.map(user => { const bookingMap = new Map(); user.Bookings.forEach(booking => { // 错误:每个Booking的ID唯一,导致每个对象都是独立的Map键 if (bookingMap.has(booking)) { bookingMap.set(booking, bookingMap.get(booking) + 1); } else { bookingMap.set(booking, 1); } }); return { ...user, Bookings: user.Bookings.map(booking => ({ ...booking, Count: bookingMap.get(booking) })) }; }); }
预期输出示例
[ { "userId": "user1", "Bookings": [ { "BookingID": "b1", "item": "laptop", "date": "2024-01-01", "Count": 2 }, { "BookingID": "b2", "item": "laptop", "date": "2024-01-02", "Count": 2 }, { "BookingID": "b3", "item": "phone", "date": "2024-01-01", "Count": 1 } ] }, { "userId": "user2", "Bookings": [ { "BookingID": "b4", "item": "tablet", "date": "2024-01-03", "Count": 2 }, { "BookingID": "b5", "item": "laptop", "date": "2024-01-04", "Count": 1 }, { "BookingID": "b6", "item": "tablet", "date": "2024-01-05", "Count": 2 } ] } ]
修正后的代码
function addBookingCount(users) { return users.map(user => { // 第一步:统计当前用户下每个item的出现次数 const itemCountMap = new Map(); user.Bookings.forEach(booking => { // 用item作为分组键(如果有itemId,建议用itemId更准确) const key = booking.item; itemCountMap.set(key, (itemCountMap.get(key) || 0) + 1); }); // 第二步:给每个Booking对象添加Count字段 return { ...user, Bookings: user.Bookings.map(booking => ({ ...booking, Count: itemCountMap.get(booking.item) })) }; }); }
代码说明
- 统计阶段:对每个用户的Bookings数组遍历一次,用
item(或itemId)作为Map的键,累计每个item的出现次数,避免了原代码中因BookingID唯一导致的分组失效问题。 - 赋值阶段:再次遍历原Bookings数组,从统计好的Map中取出对应item的计数,添加为
Count字段,完全保留原数组的结构和所有原始字段。 - 如果你的item有唯一标识符(比如
itemId),替换booking.item为booking.itemId即可,能避免item名称重复但实际是不同物品的统计错误。
内容的提问来源于stack exchange,提问作者its me
相关产品推荐
相关产品推荐

