如何拆分数组元素为姓名与金额字段,求和后判定获胜者
按姓名汇总金额并找出获胜者的实现方案
先明确下你的需求场景:
现有数组:
let receipts_array =["Anna 0.4","Peter 0.25","Anna 0.5","Peter 0.5","Peter 0.33"];
需要把每个元素拆分成姓名和金额,按姓名求和后找出总金额更高的获胜者,预期结果是Peter。
我给你两种JavaScript实现思路,你可以根据自己的习惯选择:
方案一:基础遍历+对象累加
这种方式逻辑直白,适合刚接触数组处理的开发者理解:
let receipts_array = ["Anna 0.4", "Peter 0.25", "Anna 0.5", "Peter 0.5", "Peter 0.33"]; // 初始化空对象,用来存储每个人的总金额 const totalAmounts = {}; // 遍历数组处理每一条记录 receipts_array.forEach(item => { // 按空格拆分姓名和金额字符串 const [name, amountStr] = item.split(' '); // 把金额转成浮点数,避免字符串拼接错误 const amount = parseFloat(amountStr); // 累加金额:如果姓名已存在则追加,否则初始化金额 if (totalAmounts[name]) { totalAmounts[name] += amount; } else { totalAmounts[name] = amount; } }); // 找出总金额最高的获胜者 let winner = ''; let highestTotal = 0; for (const name in totalAmounts) { if (totalAmounts[name] > highestTotal) { highestTotal = totalAmounts[name]; winner = name; } } console.log(winner); // 输出结果:Peter
方案二:用reduce简化累加逻辑
如果你熟悉数组高阶函数,用reduce可以把累加步骤写得更紧凑:
let receipts_array = ["Anna 0.4", "Peter 0.25", "Anna 0.5", "Peter 0.5", "Peter 0.33"]; // 用reduce一步完成金额累加 const totalAmounts = receipts_array.reduce((acc, item) => { const [name, amountStr] = item.split(' '); const amount = parseFloat(amountStr); // 用(acc[name] || 0)处理首次出现的姓名,不存在则取0再加当前金额 acc[name] = (acc[name] || 0) + amount; return acc; }, {}); // 初始值为空对象 // 找获胜者的逻辑和方案一一致 let winner = ''; let highestTotal = 0; for (const name in totalAmounts) { if (totalAmounts[name] > highestTotal) { highestTotal = totalAmounts[name]; winner = name; } } console.log(winner); // 输出结果:Peter
关键细节说明
- 拆分字符串:
split(' ')适用于当前「姓名+空格+金额」的格式,如果姓名包含空格,需要调整拆分规则,但当前需求下完全适用。 - 金额转数字:必须用
parseFloat或Number()把字符串转成数字,否则字符串相加会变成拼接(比如"0.4"+"0.5"会得到"0.40.5",而非0.9)。 - 平局处理:如果两人总金额相同,上述代码会返回先遍历到的人;若需要处理平局,可以在最后添加逻辑,收集所有最高金额的姓名。
内容的提问来源于stack exchange,提问作者user6311492
相关产品推荐
相关产品推荐

