Хватает правки из двух строк

Я собираюсь немного углубиться в мою проблему, вы можете перейти к TL; DR, если вы не хотите читать все это

Что я пытаюсь сделать

Мне нужно хранить "файл"(Текстовый документ) который может быть отредактирован пользователем. Если у меня есть мой оригинальный файл(который может быть огромным)

Лорем ипсум долор сит амет

и пользователь должен был внести изменения:

Foo ipsum amet_ sit

По сути, у меня есть исходная строка и строка, отредактированная пользователем. Я хочу найти различия,«редактирование», Для предотвращения хранения дубликатовочень большой строки. Я хочу хранить оригинал и «правки». Затем примените изменения к оригиналу. Вроде как дедупликация данных. Проблема в том, что я понятия не имею, какими могут быть разные правки, и мне также нужно иметь возможность применить эти правки к строке.

попытки

Поскольку текст может быть огромным, я задаюсь вопросом, что было бы наиболее «эффективным» способом сохранения изменений в тексте без сохранения двух отдельных версий. Моим первым предположением было что-то вроде:

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)

затем вернуться назад:

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

По сути, я пытаюсь разбить текст по пробелам на массивы. Сравните массивы и сохраните различия. Затем примените различия, чтобы сгенерировать модифицированную версию.

Проблемы

Но если бы количество пробелов изменилось, возникли бы проблемы:

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

Выход:OriginalString of text... text...

Мой желаемый результат:OriginalString of text...

Даже если бы я должен был переключитьсяstr.length сmod.length а такжеedits.length лайк:

// 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 было бы:["ModifiedString", "of", "text..."] в результате чего хранение «правок» становится бесполезным. И даже хуже, если слово будет добавлено / удалено. Еслиstr должны были статьOriginal String of lots of text..., Вывод будет все тот же.

Я вижу, что в том, как я это делаю, есть много недостатков, но я не могу думать ни о каком другом.

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:

Как бы вы нашли изменения между двумя строками?

Я имею дело с большими кусками текста, каждый из которых может быть омегабайт сто килобайт. Это работает в браузере

Ответы на вопрос(4)

Ваш ответ на вопрос