Grabbing Bearbeitungen von zwei Zeichenfolgen

Ich werde mich etwas eingehender mit meinem Problem befassen. Sie können zu TL; DR springen, wenn Sie nicht alles lesen möchten.

Was ich versuche zu tun

Ich muss eine "Datei" speichern(Text dokument, das vom Benutzer bearbeitet werden kann. Wenn ich meine Originaldatei habe (was sehr groß sein könnte)

Lorem Ipsum Dolor sitzen amet

und der Benutzer sollte eine Änderung vornehmen:

Foo ipsum amet_ sit

rundsätzlich habe ich die ursprüngliche Zeichenfolge und die vom Benutzer bearbeitete Zeichenfolge. Ich möchte die Unterschiede finden, "Änderungen". So verhindern Sie das Speichern von Duplikaten vonsehr gro Strings. Ich möchte das Original und die "Bearbeitungen" speichern. Wenden Sie dann die Änderungen auf das Original an. Art wie Datendeduplizierung. Das Problem ist, dass ich keine Ahnung habe, wie unterschiedlich die Bearbeitungen sein können, und dass ich diese Bearbeitungen auch auf die Zeichenfolge anwenden muss.

Versuch

Da der Text sehr groß sein könnte, frage ich mich, was die "effizienteste" Möglichkeit wäre, Änderungen am Text zu speichern, ohne zwei separate Versionen zu speichern. Meine erste Vermutung war etwas in der Art von:

var str = 'Original String of text...'.split(' ') || [],
    mod = 'Modified String of text...'.split(' ') || [], i, edits = [];

for (i = 0; i < str.length; i += 1) {
    edits.push(str[i]===mod[i] ? undefined : mod[i]);
}

console.log(edits); // ["Modified", null, null, null] (desired output)

then, um zurück zu kehren:

for (i = 0; i < str.length; i += 1) {
    str[i] = edits[i] || str[i];
}
str.join(' '); // "Modified String of text..."

rundsätzlich versuche ich, den Text durch Leerzeichen in Arrays aufzuteilen. Vergleichen Sie die Arrays und speichern Sie die Unterschiede. Wenden Sie dann die Unterschiede an, um die geänderte Version @ zu generiere

Probleme

Aber wenn sich die Anzahl der Leerzeichen ändern würde, würden Probleme auftreten:

str: Original String of text... mod: OriginalString of text...

Ausgabe:OriginalString of text... text...

Meine gewünschte Ausgabe:OriginalString of text...

Auch wenn ich wechseln würdestr.length mitmod.length undedits.length mögen

// Get edits
var str = 'Original String of text...'.split(' ') || [],
    mod = 'Modified String of text...'.split(' ') || [], i, edits = [];

for (i = 0; i < mod.length; i += 1) {
    edits.push(str[i]===mod[i] ? undefined : mod[i]);
}

// Apply edits
var final = [];
for (i = 0; i < edits.length; i += 1) {
    final[i] = edits[i] || str[i];
}
final = final.join(' ');

edits wäre:["ModifiedString", "of", "text..."] im Ergebnis macht das Speichern der gesamten Bearbeitungssache unbrauchbar. Und noch schlimmer, wenn ein Wort hinzugefügt / entfernt wird. Wennstr sollte @ werdOriginal String of lots of text.... Die Ausgabe wäre immer noch dieselbe.

Ich kann sehen, dass sie viele Fehler in der Art und Weise sind, wie ich das tue, aber ich kann mir keinen anderen Weg vorstellen.

Snippet:

document.getElementById('go').onclick = function() {
  var str = document.getElementById('a').value.split(' ') || [],
    mod = document.getElementById('b').value.split(' ') || [],
    i, edits = [];

  for (i = 0; i < mod.length; i += 1) {
    edits.push(str[i] === mod[i] ? undefined : mod[i]);
  }

  // Apply edits
  var final = [];
  for (i = 0; i < edits.length; i += 1) {
    final[i] = edits[i] || str[i];
  }
  final = final.join(' ');
  alert(final);
};

document.getElementById('go2').onclick = function() {
  var str = document.getElementById('a').value.split(' ') || [],
    mod = document.getElementById('b').value.split(' ') || [],
    i, edits = [];

  for (i = 0; i < str.length; i += 1) {
    edits.push(str[i] === mod[i] ? undefined : mod[i]);
  }

  for (i = 0; i < str.length; i += 1) {
    str[i] = edits[i] || str[i];
  }
  alert(str.join(' ')); // "Modified String of text..."
};
Base String:
<input id="a">
<br/>Modified String:
<input id="b" />
<br/>
<button id="go">Second method</button>
<button id="go2">First Method</button>

TL; DR:

Wie würden Sie die Änderungen zwischen zwei Zeichenfolgen finden?

Ich habe es mit großen Textstücken zu tun, bei denen es sich jeweils um ein @ handeln könntMegabyt hundert Kilobyte. Dies läuft auf dem Browser

Antworten auf die Frage(8)

Ihre Antwort auf die Frage