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

如何修正代码实现按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)
      }))
    };
  });
}

代码说明

  1. 统计阶段:对每个用户的Bookings数组遍历一次,用item(或itemId)作为Map的键,累计每个item的出现次数,避免了原代码中因BookingID唯一导致的分组失效问题。
  2. 赋值阶段:再次遍历原Bookings数组,从统计好的Map中取出对应item的计数,添加为Count字段,完全保留原数组的结构和所有原始字段。
  3. 如果你的item有唯一标识符(比如itemId),替换booking.item为booking.itemId即可,能避免item名称重复但实际是不同物品的统计错误。

内容的提问来源于stack exchange,提问作者its me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:02:47