Хватает правки из двух строк
Я собираюсь немного углубиться в мою проблему, вы можете перейти к 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:Как бы вы нашли изменения между двумя строками?
Я имею дело с большими кусками текста, каждый из которых может быть омегабайт сто килобайт. Это работает в браузере