Javascriptでは、2つの文字列の間にいくつの違いがあるかを確認したいと思います。名前に追加された文字が文字ごとに1つの変更としてカウントすべきであるJavascriptで2つの文字列の違いを検出する
var oldName = "Alec";
var newName = "Alexander";
var differences = getDifference(oldName, newName) // differences = 6
- :よう
何か。
- レターの変更は、レターごとの変更としてカウントされます。スワップ2つの
- の文字は実際にはそれぞれ
という名前で変更されるため、2つの変更としてカウントされます。 - ただし、文字をシフトして別の文字を挿入すると、1つの変更としてカウントされます。例えば
:5つの文字は「アレックス」を変更する
を追加されているとして、「アレキサンダー」は5つの変更になるために「アレックス」を変更するは「Allexでは」だけのように1つの変更になります"l"を追加して残りをシフトしましたが、変更しませんでした。
"Alexander"を "Allesander"に変更すると、2つの変更( "l"を追加し、 "x"を "s"に変更)
私は文字の配列にそれぞれの名前を分割し、以下の機能と、この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<testLength;i++){
if(oldName[i]!=newName[i]) {
changeCount++;
}
}
alert(changeCount);
}
しかし、私はとしてカウントしない文字のシフトを占めることができる方法変化する?
アップデート:ここで私はは私がまさに必要だった
レーベンシュタイン距離を作業それを得た方法です。ピーターに感謝!
$(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>
機能のためのジェームズウエストゲートへのクレジット:
Jame's post showing this function
あなたが手紙を引く場合はどうなりますか?だから "Alex"から "Ale"へ? – elclanrs
それはあまりにも変更されるだろう – DelightedD0D
この質問は本当により注目を必要とする、これは方法がクールです。 @ DelightedD0D、2つのこと:1.別のソースからその関数を取得しましたか、それとも自分でコード化しましたか? 2.私はそれを使用する許可を持っていますか? –