JavaScript数组匹配计数函数问题:正确性排查及未定义报错解决
你的数组比较函数问题解析与修正
嘿,作为编程新手能自己动手写逻辑已经很棒啦!咱们一步步来解决你的问题~
首先解决「compare未定义」的报错
你贴的代码里有个明显的语法问题:compare函数没有写完!最后缺少了闭合的花括号(})——Chrome控制台解析到这里时,会认为这个函数还没定义完成,所以当你尝试调用它的时候就会抛出「compare未定义」的错误。
然后看看代码逻辑的问题
除了语法错误,你的代码还有两个需要优化的点:
- 全局变量
score的问题:你把score定义在了函数外面,这意味着每次调用compare函数,得分会累加而不是重置。比如第一次调用得2分,第二次调用会在2的基础上继续加,这肯定不是你想要的计分逻辑。 - 嵌套循环的效率问题:两层嵌套循环的时间复杂度是O(n*m),如果两个数组都很大的话,运行速度会变慢。
修正后的代码版本
版本1:修复原逻辑(适合新手理解)
function compare(arr1, arr2) { let score = 0; // 把score移到函数内部,每次调用都重置为0 for (let i = 0; i < arr2.length; i++) { for (let j = 0; j < arr1.length; j++) { if(arr1[j] === arr2[i]){ score++; } } } return score; // 别忘了返回计算好的得分! } // 测试一下 console.log(compare([1,2,3], [2,3,4])); // 应该输出2
版本2:更高效的实现(利用Set优化)
如果想让代码更高效,可以把其中一个数组转成Set,因为Set的has()方法查找元素是O(1)的时间复杂度,整体时间复杂度降到O(n+m):
function compare(arr1, arr2) { const set1 = new Set(arr1); let score = 0; for (const item of arr2) { if (set1.has(item)) { score++; } } return score; } // 测试 console.log(compare([1,2,3], [2,3,4])); // 输出2
额外提醒
调用函数的时候要确保函数已经定义完成再调用哦!比如把函数写在调用语句的前面,或者把调用放在DOMContentLoaded事件里(如果是在网页中使用的话)。
内容的提问来源于stack exchange,提问作者Nil folquer covarrubias
相关产品推荐
相关产品推荐

