如何修复查询奥运选手奖牌的JS函数仅返回首枚奖牌的问题
问题根因
原函数在循环内匹配到第一条符合条件的记录后,就直接执行return语句终止了函数运行,没有继续遍历后续的所有奖牌记录,因此只能拿到第一枚奖牌。
修改后代码
function TotalAwards(fullName){ var medals = getColumn("Olympic Medals", "Medal"); var firstName = getColumn("Olympic Medals", "Athlete First Name"); var lastName = getColumn("Olympic Medals", "Athlete Last Name"); // 初始化空数组存储所有匹配到的奖牌 var matchedMedals = []; for(var i=0; i<medals.length; i++){ if (firstName[i] + " " + lastName[i] == fullName){ // 匹配到就加入数组,不直接返回 matchedMedals.push(medals[i]); } } // 循环全部跑完后判断结果 return matchedMedals.length > 0 ? matchedMedals : "Not found"; }
关键修改说明
- 新增了
matchedMedals空数组,专门用来收集所有符合条件的奖牌记录 - 移除了循环内部的
return语句,匹配到对应运动员的记录后,仅将奖牌推入数组,让循环可以遍历完全部的奖牌数据 - 所有数据遍历完成后再统一返回结果:如果数组有值就返回整个奖牌数组,没有匹配到记录再返回"Not found"
如果需要支持你调用时传入的第二个布尔参数实现自动打印,还可以额外扩展逻辑,示例如下:
function TotalAwards(fullName, autoPrint){ var medals = getColumn("Olympic Medals", "Medal"); var firstName = getColumn("Olympic Medals", "Athlete First Name"); var lastName = getColumn("Olympic Medals", "Athlete Last Name"); var matchedMedals = []; for(var i=0; i<medals.length; i++){ // 新增trim处理空格差异,避免前后空格导致匹配失败 if ((firstName[i] + " " + lastName[i]).trim() == fullName.trim()){ matchedMedals.push(medals[i]); } } var result = matchedMedals.length > 0 ? matchedMedals : "Not found"; // 第二个参数为true时自动打印结果 if(autoPrint) console.log(result); return result; }
之后执行console.log(TotalAwards("Mathew Helm", true));就会输出该运动员的所有获奖记录了。
小提示:你原调用时传入的名字前带有前导空格,如果数据库中存储的姓名没有对应前导空格,会导致匹配失败,上述扩展代码中已经增加了trim()方法统一去除两端空格,适配不同格式的输入。
内容的提问来源于stack exchange,提问作者Grettaggn
相关产品推荐
相关产品推荐

