web-dev-qa-db-ja.com

JavaScriptの2つの文字列の違いを見つけます

2つの文字列の違いを見つける必要があります。

const string1 = 'lebronjames';
const string2 = 'lebronnjames';

 _

予想される出力は、余分なnを見つけてコンソールに記録することです。

JavaScriptでこれを行う方法はありますか?

7
Elvis S.

もう一つの選択肢は、より洗練された差分チェックのための、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つの文字列間の違いを示しています。具体的には...

  • 要素3は、位置3のbである「」が見つかったことを示します。
  • 要素10は、位置9のaに「n」が見つかったことを示す。
  • 要素11は、位置10のbである文字「」が見つかったことを示す。
  • 要素15は、位置13のaである文字「i」が見つかったことを示す。
  • 要素16は、位置14のbで文字「e」が見つかったことを示す。
  • 要素18は、位置15の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削除したアライン[]と追加のブリンク[]を単純に一致させるので、線が実際に移動したという保証はありませんが、確かに動かされたという強い可能性があります。

1
Jon Trent
    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
Nero

これは2つの文字列の最初の違いを返します

lebronjameslebronnjamesのように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)); _
0
G.aziz