如何用循环结构优化function?获取array中总分最高棋手姓名
优化计算棋手总分最高姓名的函数
需求说明:
现有名为chess_players的数组,每个元素是包含棋手姓名(name)和得分数组(points)的对象。需创建可复用函数(数组添加更多棋手时无需修改即可运行),接收该数组为参数,返回总分最高的棋手姓名。
原尝试代码:
let chess_players = [{name:"Jackson",points:[900,1000,3000,1950,5000]},{name:"Steve",points:[300,400,900,1000,2020]}] function returnName(object){ /* 我尝试用for in循环遍历每个数组,计算每个数组的总和 */ for (var num in object){ var index = 0; var length = object.length; var sum = 0; /* 我尝试返回最大值 */ sum += object.fact[index ++] var maxVal = Math.max(...sum); } return array[index].name; } console.log(returnName(chess_players))
原代码存在的问题
- 用
for...in遍历数组不合适:for...in是为遍历对象属性设计的,遍历数组容易出现意外问题,应该用for...of或普通for循环。 - 总分计算逻辑错误:错误使用
object.fact,应该访问每个棋手对象的points数组;且只累加了一次值,没有遍历完整个得分数组。 Math.max使用错误:sum是单个数值,不能用展开运算符...,且这一步逻辑完全不符合“找最高总分”的需求。- 变量作用域错误:
index、sum在循环内部每次都会被重置,无法正确累加总分。 - 返回值逻辑错误:函数参数是
object,但返回时用了未定义的array变量,且index的取值逻辑混乱。
优化后的实现方案
我们可以分两步实现:先计算每个棋手的总分,再遍历数组找出总分最高的棋手。
let chess_players = [{name:"Jackson",points:[900,1000,3000,1950,5000]},{name:"Steve",points:[300,400,900,1000,2020]}] function getTopPlayer(players) { // 处理空数组的边界情况 if (!players || players.length === 0) { return null; } let topPlayer = players[0]; // 计算初始棋手的总分 let topTotal = topPlayer.points.reduce((acc, curr) => acc + curr, 0); // 遍历剩余棋手,对比总分 for (let i = 1; i < players.length; i++) { const currentPlayer = players[i]; const currentTotal = currentPlayer.points.reduce((acc, curr) => acc + curr, 0); if (currentTotal > topTotal) { topTotal = currentTotal; topPlayer = currentPlayer; } } return topPlayer.name; } console.log(getTopPlayer(chess_players)); // 输出: Jackson
代码说明
- 使用
reduce方法快速计算得分数组的总和,简洁高效。 - 遍历数组时维护当前总分最高的棋手和对应的总分,一次遍历即可完成对比。
- 加入了空数组的边界处理,避免报错。
- 函数参数命名更语义化(
players代替object),代码可读性更高。
内容的提问来源于stack exchange,提问作者marioconde
相关产品推荐
相关产品推荐

