2つの文字列の違いを見つける必要があります。
const string1 = 'lebronjames';
const string2 = 'lebronnjames';
_
予想される出力は、余分なnを見つけてコンソールに記録することです。
JavaScriptでこれを行う方法はありますか?
もう一つの選択肢は、より洗練された差分チェックのための、PatientIffアルゴリズムを利用することです。このアルゴリズムをJavaScriptに移植しました...
https://github.com/jontrent/PatienenceIff
··········································································································································································································································································································。たとえば、2つの文字列を比較するには、次のことができます。
_let a = "thelebronnjamist";
let b = "the lebron james";
let difference = patienceDiff( a.split(""), b.split("") );
_
... _difference.lines
_を比較の結果を持つ配列に設定されています...
_difference.lines: Array(19)
0: {line: "t", aIndex: 0, bIndex: 0}
1: {line: "h", aIndex: 1, bIndex: 1}
2: {line: "e", aIndex: 2, bIndex: 2}
3: {line: " ", aIndex: -1, bIndex: 3}
4: {line: "l", aIndex: 3, bIndex: 4}
5: {line: "e", aIndex: 4, bIndex: 5}
6: {line: "b", aIndex: 5, bIndex: 6}
7: {line: "r", aIndex: 6, bIndex: 7}
8: {line: "o", aIndex: 7, bIndex: 8}
9: {line: "n", aIndex: 8, bIndex: 9}
10: {line: "n", aIndex: 9, bIndex: -1}
11: {line: " ", aIndex: -1, bIndex: 10}
12: {line: "j", aIndex: 10, bIndex: 11}
13: {line: "a", aIndex: 11, bIndex: 12}
14: {line: "m", aIndex: 12, bIndex: 13}
15: {line: "i", aIndex: 13, bIndex: -1}
16: {line: "e", aIndex: -1, bIndex: 14}
17: {line: "s", aIndex: 14, bIndex: 15}
18: {line: "t", aIndex: 15, bIndex: -1}
_
_aIndex === -1
_または_bIndex === -1
_はどこでも2つの文字列間の違いを示しています。具体的には...
b
である「」が見つかったことを示します。a
に「n」が見つかったことを示す。b
である文字「」が見つかったことを示す。a
である文字「i」が見つかったことを示す。b
で文字「e」が見つかったことを示す。a
で文字「t」が見つかったことを示す。PatienciftIFFアルゴリズムは、2つの類似のテキストまたは文字列を比較するのに役立ちます。基本的な編集が発生したかどうかはわかりません。例えば、以下のような...
_let a = "james lebron";
let b = "lebron james";
let difference = patienceDiff( a.split(""), b.split("") );
_
...返品_difference.lines
_含有...
_difference.lines: Array(18)
0: {line: "j", aIndex: 0, bIndex: -1}
1: {line: "a", aIndex: 1, bIndex: -1}
2: {line: "m", aIndex: 2, bIndex: -1}
3: {line: "e", aIndex: 3, bIndex: -1}
4: {line: "s", aIndex: 4, bIndex: -1}
5: {line: " ", aIndex: 5, bIndex: -1}
6: {line: "l", aIndex: 6, bIndex: 0}
7: {line: "e", aIndex: 7, bIndex: 1}
8: {line: "b", aIndex: 8, bIndex: 2}
9: {line: "r", aIndex: 9, bIndex: 3}
10: {line: "o", aIndex: 10, bIndex: 4}
11: {line: "n", aIndex: 11, bIndex: 5}
12: {line: " ", aIndex: -1, bIndex: 6}
13: {line: "j", aIndex: -1, bIndex: 7}
14: {line: "a", aIndex: -1, bIndex: 8}
15: {line: "m", aIndex: -1, bIndex: 9}
16: {line: "e", aIndex: -1, bIndex: 10}
17: {line: "s", aIndex: -1, bIndex: 11}
_
Patienciffが最初と姓のスワップを報告しないことに注意してくださいが、むしろa
から削除された文字を示す結果を示し、b
に追加された文字が追加されました。 b
の結果。
編集:追加された新しいアルゴリズムDUBBEDPatienceIffplus。
上記の最後の例をムリングした後、移動する可能性があるラインを特定する際のPatienciffの制限を示した後、推奨されていることを判断するためにPatienciftIFFアルゴリズムを使用して、任意の行が表示されている可能性があるかどうかを判断することがわかった。削除と追加.
要するに、PatienceInf.jsファイルの下部にpatienceDiffPlus
アルゴリズム(上で識別されたgithub repo)を追加しました。 patienceDiffPlus
アルゴリズムは、初期patienceDiff
アルゴリズムから削除されたAlines []とBlines []を追加し、patienceDiff
アルゴリズムを介して再度実行します。つまり、patienceDiffPlus
は移動可能なラインの最長の共通のサブシーケンスを求めています。これにより、元のpatienceDiff
の結果にこれを記録します。 patienceDiffPlus
アルゴリズムは、移動した回線が見つからないまでこれを続行します。
さて、patienceDiffPlus
を使用して、次の比較が...
_let a = "james lebron";
let b = "lebron james";
let difference = patienceDiffPlus( a.split(""), b.split("") );
_
...返品_difference.lines
_含有...
_difference.lines: Array(18)
0: {line: "j", aIndex: 0, bIndex: -1, moved: true}
1: {line: "a", aIndex: 1, bIndex: -1, moved: true}
2: {line: "m", aIndex: 2, bIndex: -1, moved: true}
3: {line: "e", aIndex: 3, bIndex: -1, moved: true}
4: {line: "s", aIndex: 4, bIndex: -1, moved: true}
5: {line: " ", aIndex: 5, bIndex: -1, moved: true}
6: {line: "l", aIndex: 6, bIndex: 0}
7: {line: "e", aIndex: 7, bIndex: 1}
8: {line: "b", aIndex: 8, bIndex: 2}
9: {line: "r", aIndex: 9, bIndex: 3}
10: {line: "o", aIndex: 10, bIndex: 4}
11: {line: "n", aIndex: 11, bIndex: 5}
12: {line: " ", aIndex: 5, bIndex: 6, moved: true}
13: {line: "j", aIndex: 0, bIndex: 7, moved: true}
14: {line: "a", aIndex: 1, bIndex: 8, moved: true}
15: {line: "m", aIndex: 2, bIndex: 9, moved: true}
16: {line: "e", aIndex: 3, bIndex: 10, moved: true}
17: {line: "s", aIndex: 4, bIndex: 11, moved: true}
_
moved
属性を追加します。これは、行(またはこの場合の文字)が移動した可能性があるかどうかを識別します。繰り返しになりました。patienceDiffPlus
削除したアライン[]と追加のブリンク[]を単純に一致させるので、線が実際に移動したという保証はありませんが、確かに動かされたという強い可能性があります。
function getDifference(a, b)
{
var i = 0;
var j = 0;
var result = "";
while (j < b.length)
{
if (a[i] != b[j] || i == a.length)
result += b[j];
else
i++;
j++;
}
return result;
}
console.log(getDifference("lebronjames", "lebronnjames"));
_
これは2つの文字列の最初の違いを返します
lebronjames
とlebronnjames
のようにn
const string1 = 'lebronjames';
const string2 = 'lebronnjabes';
const findFirstDiff = (srt1, str2) =>
str2[[...string1].findIndex((el, index) => el !== string2[index])];
// equivalent of
const findFirstDiff2 = function(srt1, str2) {
return str2[[...string1].findIndex(function(el, index) {
return el !== string2[index]
})];
}
console.log(findFirstDiff2(string1, string2));
console.log(findFirstDiff(string1, string2));
_