使用Javascript检测两个字符串之间的差异 [英] detect differences between two strings with Javascript

查看:120
本文介绍了使用Javascript检测两个字符串之间的差异的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



如下:

  var oldName =Alec 
var newName =Alexander;
var differences = getDifference(oldName,newName)// differences = 6




  • 添加到名称中的任何字母应计为每个字母一个更改。

  • 更改字母应计为每个字母的更改。替换两个

  • 字母应该视为两个更改,因为您实际更改了每个

    键。




例如:



将Alex更改为Alexander会在添加5个字母后发生5个更改



将Alex更改为Allex



将Alexander更改为Allesander将是2个更改(添加 。



我可以将每个名字分成一个字母数组,并且像这个 jsFiddle 具有以下功能:

  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 if(oldName [i]!= newName [i]){
changeCount ++;
}
}
alert(changeCount);
}

但是如何解释

p>

Levenshtein距离 正是我需要的。感谢彼得!



工作jsFiddle



  $(function(){$('#compare')。click(function(){var oldName = $('。compare:eq (); var newName = $('。compare:eq(1)')val(); var count = levDist(oldName,newName) 'differences present');});}); function levDist(s,t){var d = []; // 2d matrix // Step 1 var n = s.length; var m = t.length; if(n == 0)return m; if(m == 0)return n; //在JavaScript中创建一个数组数组(下降循环更快)for(var i = n; i> = 0; i--)d [i] = [ //步骤2 for(var i = n; i> = 0; i--)d [i] [0] = i; for(var j = m; j> = 0; j--)d [0] [j] = j; //步骤3 for(var i = 1; i <= n; i ++){var s_i = s.charAt(i-1); //步骤4 for(var j = 1; j <= m; j ++){//检查到目前为止的锯齿状ld总数if(i == j& d [i] [j] return n; var t_j = t.charAt(j-1); var cost =(s_i == t_j)? 0:1; //步骤5 //计算最小变量mi = d [i-1] [j] + 1; var b = d [i] [j-1] + 1; var c = d [i-1] [j-1] + cost; if(b  1& j> 1&& s_i == t.charAt(j-2)&& s.charAt(i-2)= = d_ [i-2] [j-2] + cost); d [i] [j] }}} //第7步返回d [n] [m];}  

 < script src =https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js>< / script>< input type = buttonid =comparevalue =Compare/>< br>< br>< input type =textid =oldclass =comparevalue =Alec/> ; input type =textid =newclass =comparevalue =Alexander/>< br>< br>< span id =display>< / span> code> 



对James Westgate的功能:



Jame的显示此功能的帖子

解决方案

我手头没有Javascript实现 ,但是你正在做一些已经建立好的算法。具体来说,我相信你正在寻找两个字符串之间的Levenshtein distance - 即插入,替换和删除的数量(假设你将一个删除视为一个更改)。



Levenshtein距离的维基百科页面有各种伪代码实现,您可以从中开始,并引用也可能会帮助你。


With Javascript, I want to check how many differences there are between two strings.

Something like:

var oldName = "Alec";
var newName = "Alexander";
var differences = getDifference(oldName, newName) // differences = 6

  • Any letters added to the name should count as one change per letter.
  • Changing a letter should count as a change per letter. Swaping two
  • letters should count as two changes as your really changing each
    leter.
  • However, shifting a letter and inserting another should only count as one change.

For example:

Changing "Alex" to "Alexander" would be 5 changes as 5 letters have been added

Changing "Alex" to "Allex" would only be one change as you added an "l" and shifted the rest over but didnt change them

Changing "Alexander" to "Allesander"would be 2 changes (adding the "l" and changing "x" to a "s").

I can split each name into an array of letters and compare them easy enough like in this jsFiddle with the below function:

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);
}

But how can I account for the shifting of letters not counting as a change?


Update: Here's how I got it working

Levenshtein distance was exactly what I needed. Thanks to Peter!

Working jsFiddle

$(function () {
    $('#compare').click(function () {
        var oldName = $('.compare:eq(0)').val();
        var newName = $('.compare:eq(1)').val();
        var count = levDist(oldName, newName);
        $('#display').html('There are ' + count + ' differences present');
    });
});

function levDist(s, t) {
    var d = []; //2d matrix

    // Step 1
    var n = s.length;
    var m = t.length;

    if (n == 0) return m;
    if (m == 0) return n;

    //Create an array of arrays in javascript (a descending loop is quicker)
    for (var i = n; i >= 0; i--) d[i] = [];

    // Step 2
    for (var i = n; i >= 0; i--) d[i][0] = i;
    for (var j = m; j >= 0; j--) d[0][j] = j;

    // Step 3
    for (var i = 1; i <= n; i++) {
        var s_i = s.charAt(i - 1);

        // Step 4
        for (var j = 1; j <= m; j++) {

            //Check the jagged ld total so far
            if (i == j && d[i][j] > 4) return n;

            var t_j = t.charAt(j - 1);
            var cost = (s_i == t_j) ? 0 : 1; // Step 5

            //Calculate the minimum
            var mi = d[i - 1][j] + 1;
            var b = d[i][j - 1] + 1;
            var c = d[i - 1][j - 1] + cost;

            if (b < mi) mi = b;
            if (c < mi) mi = c;

            d[i][j] = mi; // Step 6

            //Damerau transposition
            if (i > 1 && j > 1 && s_i == t.charAt(j - 2) && s.charAt(i - 2) == t_j) {
                d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost);
            }
        }
    }
    // Step 7
    return d[n][m];
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<input type="button" id="compare" value="Compare" /><br><br>
<input type="text" id="old" class="compare" value="Alec" />
<input type="text" id="new" class="compare" value="Alexander" />
<br>
<br>
<span id="display"></span>

Credit to James Westgate for the function:

Jame's post showing this function

解决方案

I don't have a Javascript implementation on hand per se, but you're doing something for which well-established algorithms exist. Specifically, I believe you're looking for the "Levenshtein distance" between two strings -- i.e. the number of insertions, substitutions and deletions (assuming you are treating a deletion as a change).

The wikipedia page for Levenshtein distance has various pseudo-code implementations from which you could start, and references which may also help you.

这篇关于使用Javascript检测两个字符串之间的差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆