JavaScript如何按membershipType分组累加对应pointEarned值
会员按类型分组累加积分实现方案
原有代码问题说明
之前编写的逻辑存在3个核心问题:
- 没有提前初始化
subMemTypeCount统计对象,也没有给各会员类型设置初始0值 - 仅单独对
Ruby类型做了分支判断,没有覆盖所有需要统计的会员类型 - 内层循环没有实际执行积分累加的逻辑,无法完成同组积分求和
正确实现逻辑
整个实现只需要4步即可完成:
- 把所有实例化的会员对象存入统一数组,方便统一遍历
- 初始化统计对象,提前写入所有需要展示的会员类型,对应初始积分设为0,避免无对应会员时取值异常
- 遍历会员数组,将每个会员的积分累加到对应会员类型的统计值上
- 按照要求的格式输出结果,输出时类型名统一使用小写
完整可运行代码
// 原有Member类定义 class Member { constructor (membershipType, pointsEarned) { this.membershipType = membershipType; this.pointEarned = pointsEarned; } } // 原有会员实例化代码 const John = new Member('Gold', 1400); const Luke = new Member('Ruby', 250); const Sam = new Member('Gold', 3350); const Kelly = new Member('Diamond', 40200); // 将所有会员存入统一遍历数组 const memberGroup = [John, Luke, Sam, Kelly]; // 初始化积分统计对象,预置所有待统计类型初始值为0 const subMemTypeCount = { Ruby: 0, Gold: 0, Platinum: 0, Diamond: 0 }; // 遍历会员列表累加对应类型积分 for (let i = 0; i < memberGroup.length; i++) { const member = memberGroup[i]; const memberType = member.membershipType; // 仅统计预置列表内的会员类型 if (subMemTypeCount.hasOwnProperty(memberType)) { subMemTypeCount[memberType] += member.pointEarned; } } // 按指定格式输出结果 console.log("Output:"); console.log("\t\truby: " + subMemTypeCount.Ruby); console.log("\t\tgold: " + subMemTypeCount.Gold); console.log("\t\tplatinum: " + subMemTypeCount.Platinum); console.log("\t\tdiamond: " + subMemTypeCount.Diamond);
运行结果
代码执行后输出完全匹配预期:
Output: ruby: 250 gold: 4750 platinum: 0 diamond: 40200
该实现扩展性更强,后续新增会员对象时只需要将实例加入
memberGroup数组即可自动完成统计,不需要修改遍历和累加逻辑。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

