如何修正Arsenal球队总进球数计算代码?预期71实际返回0
问题诊断与修复
核心问题:大小写不匹配
JSON数据源中的球队名称采用首字母大写格式(例如"Arsenal"),但调用run('arsenal')时传入的是全小写字符串,使用严格相等运算符比较时无法匹配,导致进球数累加逻辑从未触发,最终返回0。
次要问题:未声明循环变量
for(round of data)和for(match of round.matches)中的round和match未使用let/const声明,会成为全局变量,属于不良编码实践。
修正后的代码
var https = require('https'); async function main() { return await Promise.all([ getRequestPromise('https://s3.eu-west-1.amazonaws.com/hackajob-assets1.p.hackajob/challenges/football_session/football.json') ]).then(results => { return results[0].rounds; }); } function getRequestPromise(url) { return new Promise((resolve, reject) => { let request = https.get(url, (response) => { if (response.statusCode < 200 || response.statusCode > 299) { reject(new Error('Failed to load page, status code: ' + response.statusCode)); } let body = []; response.on('data', (chunk) => body.push(chunk)); response.on('end', () => resolve(JSON.parse(body.join('')))); }); request.on('error', (err) => reject(err)); }); } async function run(teamKey) { const data = await main(); let score = 0; // 统一转换为小写,避免大小写匹配问题 const targetTeam = teamKey.toLowerCase(); for(const round of data){ for(const match of round.matches){ const team1Name = match.team1.name.toLowerCase(); const team2Name = match.team2.name.toLowerCase(); if(team1Name === targetTeam){ score += match.score1; } else if(team2Name === targetTeam){ score += match.score2; } } } return score; } // 测试调用,现在会返回预期的71 run('arsenal').then(score => console.log(score));
关键改动说明
- 大小写统一处理:将传入的
teamKey和JSON中的球队名称都转换为小写,使用toLowerCase()实现大小写不敏感的匹配,确保'arsenal'能匹配到'Arsenal'。 - 声明循环变量:在
for...of循环中添加const声明round和match,避免全局变量污染。 - 添加测试输出:调用
run后通过.then()打印结果,方便验证返回值是否符合预期。
内容的提问来源于stack exchange,提问作者soulsako20
相关产品推荐
相关产品推荐

