JavaScript收银机代码优化:合并相同币种的找零数组
合并收银机找零数组中相同币种的总额
你当前的收银机代码返回的找零是拆分后的单一面额数组(例如多个['TWENTY', 20]),需要合并为相同币种金额求和后的格式,最终返回结构如下:
{ status: 'OPEN', change: [['TWENTY', 60],['TEN', 20],...] }
可以通过对象中转累加+转二维数组的方式实现,直接上实操代码:
基础合并方案(不保证顺序)
假设你当前生成的零散找零数组为rawChange,处理逻辑如下:
// 1. 用对象累加相同币种的金额 const changeMap = {}; rawChange.forEach(([currency, amount]) => { changeMap[currency] = (changeMap[currency] || 0) + amount; }); // 2. 将对象转换为要求的二维数组格式 const mergedChange = Object.entries(changeMap); // 3. 组装最终返回结果 const result = { status: 'OPEN', change: mergedChange };
带币种顺序的合并方案(推荐)
如果需要保持找零币种从大到小的顺序(符合收银逻辑),可以提前定义币种优先级数组,再生成有序的合并数组:
// 定义收银机支持的币种优先级(从大到小,根据实际币种调整) const currencyPriority = ['ONE HUNDRED', 'TWENTY', 'TEN', 'FIVE', 'ONE', 'QUARTER', 'DIME', 'NICKEL', 'PENNY']; // 1. 累加金额 const changeMap = {}; rawChange.forEach(([currency, amount]) => { changeMap[currency] = (changeMap[currency] || 0) + amount; }); // 2. 按优先级生成有序的合并数组 const mergedChange = currencyPriority .filter(currency => changeMap.hasOwnProperty(currency)) .map(currency => [currency, changeMap[currency]]); // 3. 组装结果 const result = { status: 'OPEN', change: mergedChange };
逻辑说明
- 先用对象
changeMap作为中间容器,以币种名称为键,遍历零散数组时逐个累加对应金额; Object.entries()可以直接把键值对转换为[币种, 总额]的二维数组;- 若需要顺序,通过预定义的优先级数组过滤和映射,确保找零数组的币种顺序符合收银习惯。
内容的提问来源于stack exchange,提问作者Valentina
相关产品推荐
相关产品推荐

