使用JavaScript对用户响应进行分级(比较两个数组)

使用JavaScript对用户响应进行分级(比较两个数组),javascript,arrays,diff,Javascript,Arrays,Diff,我正在编写一个脚本,通过比较两个数组对用户响应进行分级。(这是一个测试,看看他们对信息逐字逐句的了解程度。)我已经有了一些我需要的代码,比如让用户响应小写并拆分。我所需要的只是找出差异/错误的数量。例如: var correctanswer = ["The","quick","brown","fox","jumped","over","the","lazy","dog"]; var useranswer = ["The","brown","fox","jumped","up","and","ov

我正在编写一个脚本,通过比较两个数组对用户响应进行分级。(这是一个测试,看看他们对信息逐字逐句的了解程度。)我已经有了一些我需要的代码,比如让用户响应小写并拆分。我所需要的只是找出差异/错误的数量。例如:

var correctanswer = ["The","quick","brown","fox","jumped","over","the","lazy","dog"];
var useranswer = ["The","brown","fox","jumped","up","and","over","the","really","lazy","cat"];
alert(counterrors(correctanswer, useranswer));
在这个特定的例子中,运行我正在寻找的函数将返回用户犯了5个错误(他们省略了“quick”;添加了“up”、“and”和“really”;“dog”更改为“cat”)。如您所见,这两个数组的长度可能不同

有人知道怎么做吗?我想这可能是一个循环,就像:

for (x in correctanswer) {
    // compare correctanswer[x] to useranswer[x]... not sure how exactly. Seems tricky...
}
谢谢你看这个!我看过John Resig的diff解决方案()和其他类似的东西,甚至还有一些数组比较,但似乎没有任何效果,因为我发现的那些方法返回了所有的差异,而我想看看有多少差异。再次感谢您的关注,如果有任何问题,请告诉我


更新:非常感谢Magnar给出的答案!它工作得很好。

我不确定我是否完全理解您的需求,但我认为这是解决方案

function counterrors(a, b) {
    var max = Math.max(a.length, b.length);
    var min = Math.min(a.length, b.length);
    var count = 0;
    for (var i = 0; i < min; i+=1) {
        if (a[i] !== b[i]) {
            count += 1;
        }
    }
    return count + max - min;  // max - min for any extra things that don't match
}
var correctanswer = ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"];
var useranswer = ["The", "brown", "fox", "jumped", "up", "and", "over", "the", "really", "lazy", "cat"];
alert(counterrors(correctanswer, useranswer));
功能计数器(a、b){
var max=数学最大值(a.长度,b.长度);
var min=数学最小值(a.长度,b.长度);
var计数=0;
对于(变量i=0;i
您想要的是两个阵列中的一个

它是一种计算将一个序列转换为另一个序列所需的添加、删除和替换次数的算法

有一个伪代码实现。我已经为您完成了一行对一行的JavaScript翻译:

var correctanswer = ["The","quick","brown","fox","jumped","over","the","lazy","dog"];
var useranswer =    ["The","brown","fox","jumped","up","and","over","the","really","lazy","cat"];

console.log(calculate_levenshtein_distance(correctanswer, useranswer));

function calculate_levenshtein_distance(s, t) {
  var m = s.length + 1, n = t.length + 1;
  var i, j;

  // for all i and j, d[i,j] will hold the Levenshtein distance between
  // the first i words of s and the first j words of t;
  // note that d has (m+1)x(n+1) values
  var d = [];

  for (i = 0; i < m; i++) {
    d[i] = [i]; // the distance of any first array to an empty second array
  }
  for (j = 0; j < n; j++) {
    d[0][j] = j; // the distance of any second array to an empty first array
  }

  for (j = 1; j < n; j++) {
    for (i = 1; i < m; i++) {
      if (s[i - 1] === t[j - 1]) {
        d[i][j] = d[i-1][j-1];           // no operation required
      } else {
        d[i][j] = Math.min(
                    d[i - 1][j] + 1,     // a deletion
                    d[i][j - 1] + 1,     // an insertion
                    d[i - 1][j - 1] + 1  // a substitution
                  );
      }
    }
  }

  return d[m - 1][n - 1];
}
var correctanswer=[“The”,“quick”,“brown”,“fox”,“jumped”,“over”,“The”,“The”,“lazy”,“dog”];
var useranswer=[“The”,“brown”,“fox”,“jump”,“up”,“and”,“over”,“The”,“really”,“lazy”,“cat”];
log(计算levenshtein_距离(correctanswer,useranswer));
函数计算距离(s,t){
var m=s.length+1,n=t.length+1;
varⅠ,j;
//对于所有的i和j,d[i,j]将保持它们之间的Levenshtein距离
//s的第一个i字和t的第一个j字;
//注意,d有(m+1)x(n+1)个值
var d=[];
对于(i=0;i

这将把
5
记录到控制台。正如您将看到的,这是阵列之间的正确距离。该学生没有添加
惰性
。所以它是1个删除,3个添加和1个替换。

John-谢谢分享。我刚刚试过,它计算了10个错误,而不是6个…如果他们需要按顺序键入单词,10是正确的值。您是否试图找出用户没有键入答案中的多少单词?我认为Magnar有你想要的解决方案。我试图找到添加、删除和单词变化的数量(比如用“猫”替换“狗”)。所以不仅仅是他们没有输入的东西,还有他们输入的不正确的东西。。。还有其他想法吗?编辑:刚刚看到麦格纳的答案。麦格纳-谢谢!我想就是这样。。。那么我会像文章中那样传递数组值而不是字符串吗?是的,你会使用数组值而不是字符;谢谢你的帮助!我还不太擅长JavaScript,但我会尝试从这里开始。如果您对如何实施有任何建议,请让我知道。我将把这标记为已接受的答案。我为您将维基百科伪代码翻译成JavaScript。:-)谢谢我更新了主要帖子,因为(就像你说的)有5个错误,而不是6个。您的函数在FF中的运行速度比我以前找到的快()。