You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript数组匹配计数函数问题:正确性排查及未定义报错解决

你的数组比较函数问题解析与修正

嘿,作为编程新手能自己动手写逻辑已经很棒啦!咱们一步步来解决你的问题~

首先解决「compare未定义」的报错

你贴的代码里有个明显的语法问题:compare函数没有写完!最后缺少了闭合的花括号(})——Chrome控制台解析到这里时,会认为这个函数还没定义完成,所以当你尝试调用它的时候就会抛出「compare未定义」的错误。

然后看看代码逻辑的问题

除了语法错误,你的代码还有两个需要优化的点:

  1. 全局变量score的问题:你把score定义在了函数外面,这意味着每次调用compare函数,得分会累加而不是重置。比如第一次调用得2分,第二次调用会在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:56:03