map的作用

6 阅读2分钟

1. Map(映射表)是什么?

Map 是一种键值对(key-value)数据结构,用于快速查找。

// 这是一个对象,用作映射表

const couponMoneyMap: { [userCouponId: number]: number } = {};

  • 键(Key):userCouponId(用户优惠券ID)
  • 值(Value):couponMoney(优惠券金额)

例如:

couponMoneyMap = {

  101: 10,    // 优惠券ID 101 对应 10元

  102: 20,    // 优惠券ID 102 对应 20元

  103: 5      // 优惠券ID 103 对应 5元

}

2. 为什么要这样写?

目的:提高查找效率。

不使用 Map 的方式(低效):// 每次都要遍历整个数组查找extra.selectUserCouponIds.forEach(id => {  // 需要遍历 couponListData 找到对应的优惠券  const coupon = couponListData.find(c => c.userCouponId === id);  sum += coupon.couponMoney;});// 时间复杂度:O(n × m),n是优惠券数量,m是购物车项数量

使用 Map 的方式(高效):// 先构建映射表(一次遍历)couponListData.forEach(c => {  couponMoneyMap[c.userCouponId] = c.couponMoney;});// 然后直接通过ID查找(O(1)时间复杂度)extra.selectUserCouponIds.forEach(id => {  sum += couponMoneyMap[id]; // 直接查找,非常快!});// 时间复杂度:O(n + m),大大提升性能

3. 这段代码的具体作用

check.vueLines 180-189

const newCouponMap: { [cartId: number]: number } = {}; // 新的优惠券金额映射表

const newPointsMap: { [cartId: number]: number } = {}; // 新的积分金额映射表

const couponMoneyMap: { [userCouponId: number]: number } = {}; // 用户优惠券ID到金额的映射

// 构建优惠券金额映射表

if (couponListData.value?.enableCoupons) {

    couponListData.value.enableCoupons.forEach((c: any) => {

        couponMoneyMap[c.userCouponId] = Number(c.couponMoney) || 0;

    });

}

步骤说明:

  1. 创建三个映射表:
  • newCouponMap:购物车ID → 该购物车使用的优惠券总金额
  • newPointsMap:购物车ID → 该购物车使用的积分
  • couponMoneyMap:优惠券ID → 优惠券金额(用于快速查找)
  1. 构建 couponMoneyMap:
  • 遍历所有可用优惠券
  • 将 userCouponId 作为键,couponMoney 作为值存入映射表
  • 后续可通过优惠券ID直接获取金额,无需再遍历数组

4. 实际应用场景

假设用户选择了多个优惠券:

// 用户选择了优惠券ID: [101, 102, 103]

// 需要计算总优惠金额

// 没有Map:需要遍历3次数组查找

// 有Map:直接 couponMoneyMap[101] + couponMoneyMap[102] + couponMoneyMap[103]

在后续代码中(第198-200行):

newCouponMap[cartId] = extra.selectUserCouponIds.reduce((sum: number, id: number) => {

    return sum + (couponMoneyMap[id] || 0);  // 直接通过ID查找,非常快!

}, 0);

5. 总结

  • Map 的作用:用 ID 快速查找对应数据,避免重复遍历
  • 为什么这样写:提升性能,代码更清晰
  • 适用场景:需要频繁通过某个唯一标识(如ID)查找数据的场景

这是常见的前端优化技巧,特别适合处理大量数据时的查找操作。