使用Javascript检测两个字符串之间的差异

使用Javascript检测两个字符串之间的差异,javascript,string,compare,Javascript,String,Compare,使用Javascript,我想检查两个字符串之间有多少差异 比如: var oldName = "Alec"; var newName = "Alexander"; var differences = getDifference(oldName, newName) // differences = 6 添加到名称中的任何字母应视为每个字母的一次更改 更改字母应视为每个字母的更改。交换两个 字母应该算作两个变化,因为你的每一个变化都是真实的 莱特 但是,移动一个字母并插入另一个字母只能算作一次

使用Javascript,我想检查两个字符串之间有多少差异

比如:

var oldName = "Alec";
var newName = "Alexander";
var differences = getDifference(oldName, newName) // differences = 6
  • 添加到名称中的任何字母应视为每个字母的一次更改
  • 更改字母应视为每个字母的更改。交换两个
  • 字母应该算作两个变化,因为你的每一个变化都是真实的
    莱特
  • 但是,移动一个字母并插入另一个字母只能算作一次更改。
例如:

将“Alex”更改为“Alexander”将是5个更改,因为添加了5个字母

将“Alex”改为“Allex”只会是一个变化,因为您添加了一个“l”,并将其余的改为“l”,但没有改变它们

将“Alexander”改为“Allesander”将有2个更改(添加“l”并将“x”改为“s”)

我可以将每个名称拆分为一个字母数组,并很容易地将它们与下面的函数进行比较:

function compareNames(){
    var oldName = $('#old').val().split("");
    var newName = $('#new').val().split("");
    var changeCount = 0;
    var testLength = 0;
    if(oldName.length > newName.length){
        testLength=oldName.length;    
    }
    else testLength=newName.length;
    for(var i=0;i<testLength;i++){
        if(oldName[i]!=newName[i]) {
           changeCount++;           
        }
    }
    alert(changeCount);
}
函数compareNames(){
var oldName=$('#old').val().split(“”);
var newName=$('#new').val().split(“”);
var-changecont=0;
var testLength=0;
如果(oldName.length>newName.length){
testLength=oldName.length;
}
else testLength=newName.length;

对于(var i=0;i我手头上没有Javascript实现本身,但您正在做一些有完善算法的事情。具体来说,我相信您正在寻找两个字符串之间的“Levenshtein距离”——即插入、替换和删除的数量(假设您将删除视为一种更改)

有各种各样的伪代码实现,您可以从这些实现开始,还有一些参考资料也可能对您有所帮助。

/**
*计算两个字符串之间的Levenshtein编辑距离。
*@param{string}a
*@param{string}b
*@return{number}两个字符串之间的编辑距离。
*/
goog.string.editDistance=函数(a,b){
var v0=[];
var v1=[];
如果(a==b){
返回0;
}
如果(!a.length | |!b.length){
返回Math.max(a.length,b.length);
}
对于(变量i=0;i
如果减去字母会发生什么?那么“Alex”变成“Ale”例如?是的,这将是一个变化。这个问题确实需要更多的关注,这太酷了。@delighted0d,两件事:1.你是从其他来源获得该函数还是自己编写的?2.我有使用它的权限吗?@ChrisCirefice-Nah,有点超出我的能力,@JamesWestgate在我理解的情况下编写了该函数。请检查什么是
goog
?这是谷歌的闭包库。你只需删除
goog.string
/**
 * Computes the Levenshtein edit distance between two strings.
 * @param {string} a
 * @param {string} b
 * @return {number} The edit distance between the two strings.
 */
goog.string.editDistance = function(a, b) {
  var v0 = [];
  var v1 = [];

  if (a == b) {
    return 0;
  }

  if (!a.length || !b.length) {
    return Math.max(a.length, b.length);
  }

  for (var i = 0; i < b.length + 1; i++) {
    v0[i] = i;
  }

  for (var i = 0; i < a.length; i++) {
    v1[0] = i + 1;

    for (var j = 0; j < b.length; j++) {
      var cost = Number(a[i] != b[j]);
      // Cost for the substring is the minimum of adding one character, removing
      // one character, or a swap.
      v1[j + 1] = Math.min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost);
    }

    for (var j = 0; j < v0.length; j++) {
      v0[j] = v1[j];
    }
  }

  return v1[b.length];
};