使用JavaScript Array find方法报错:期望undefined等于'2015'
问题排查与修正
核心问题
你的函数设计和测试用例的预期不匹配,同时对Array.find()的回调逻辑理解存在偏差:
- 测试用例期望
superbowlWin是一个接收赛事记录数组作为参数、直接返回获胜年份的函数; - 但你写的
superbowlWin是给find用的回调函数(接收单个数组元素为参数),导致测试调用时无法正确获取结果,返回undefined。
修正后的代码
调整superbowlWin函数,让它直接接收数组参数,内部用find完成匹配逻辑:
const record = [ { year: "2018", result: "N/A"}, { year: "2017", result: "N/A"}, { year: "2016", result: "N/A"}, { year: "2015", result: "W"}, { year: "2014", result: "N/A"}, { year: "2013", result: "L"}, { year: "2012", result: "N/A"}, { year: "2011", result: "N/A"}, { year: "2010", result: "N/A"}, { year: "2009", result: "N/A"}, { year: "2008", result: "N/A"}, { year: "2007", result: "N/A"}, { year: "2006", result: "N/A"}, { year: "2005", result: "N/A"}, { year: "2004", result: "N/A"}, { year: "2003", result: "N/A"}, { year: "2002", result: "N/A"}, { year: "2001", result: "N/A"}, { year: "2000", result: "N/A"}, { year: "1999", result: "N/A"}, { year: "1998", result: "W"}, { year: "1997", result: "W"}, { year: "1996", result: "N/A"}, { year: "1995", result: "N/A"}, { year: "1994", result: "N/A"}, { year: "1993", result: "N/A"}, { year: "1992", result: "N/A"}, { year: "1991", result: "N/A"}, { year: "1990", result: "N/A"}, { year: "1989", result: "L"}, { year: "1988", result: "N/A"}, { year: "1987", result: "L"}, { year: "1986", result: "L"}, { year: "1985", result: "N/A"}, { year: "1984", result: "N/A"}, { year: "1983", result: "N/A"}, { year: "1982", result: "N/A"}, { year: "1981", result: "N/A"}, { year: "1980", result: "N/A"}, { year: "1979", result: "N/A"}, { year: "1978", result: "N/A"}, { year: "1977", result: "N/A"}, { year: "1976", result: "L"}, { year: "1975", result: "N/A"}, { year: "1974", result: "N/A"}, { year: "1973", result: "N/A"}, { year: "1972", result: "N/A"}, { year: "1971", result: "N/A"}, { year: "1970", result: "N/A"}, { year: "1969", result: "N/A"}, { year: "1968", result: "N/A"}, { year: "1967", result: "N/A"}, { year: "1966", result: "N/A"}, { year: "1965", result: "N/A"}, { year: "1964", result: "N/A"}, { year: "1963", result: "N/A"}, { year: "1962", result: "N/A"}, { year: "1961", result: "N/A"}, { year: "1960", result: "N/A"} ]; function superbowlWin(record) { // 用find找到结果为"W"的记录,回调返回布尔值判断匹配 const winningEntry = record.find(entry => entry.result === "W"); // 存在获胜记录则返回年份,否则返回undefined return winningEntry ? winningEntry.year : undefined; } // 调用示例 console.log(superbowlWin(record)); // 输出 '2015'
原代码的问题解析
- 回调函数逻辑不规范:
find的回调函数应该返回布尔值(true/false)来标识当前元素是否符合条件,你返回年份字符串虽然能触发find的匹配(因为非空字符串是真值),但这不是标准写法,容易混淆逻辑。 - 函数职责不符预期:测试用例应该是直接调用
superbowlWin(record)来获取年份,但你的函数只能作为find的回调使用,传入整个数组时,element.result不存在,函数返回undefined,导致断言失败。
内容的提问来源于stack exchange,提问作者McNaughty
相关产品推荐
相关产品推荐

