我将深入探讨我的问题,如果您不想阅读所有内容,可以跳至 TL;DR
我正在尝试做什么
我需要存储一个“文件”(文本文件)可以由用户编辑。如果我有原始文件(这可能是巨大的)
Lorem ipsum dolor 坐 amet
用户要进行更改:
Foo ipsum amet_ 坐
基本上,我有原始字符串和用户编辑的字符串。我想找出差异"edits"。为了防止存储重复的很大字符串。我想存储原始内容和“编辑内容”。然后将编辑应用到原始内容。有点像重复数据删除。问题是我不知道编辑有多么不同,而且我还需要能够将这些编辑应用到字符串。
Attempts
因为文本可能很大,所以我想知道在不存储两个单独版本的情况下存储对文本的编辑的最“有效”方法是什么。我的第一个猜测是:
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..."
基本上,我试图将文本按空格分割成数组。比较数组并存储差异。然后应用差异来生成修改后的版本
Problems
但如果空间量发生变化,就会出现问题:
str
: Original String of text...
mod
: OriginalString of text...
Output: OriginalString of text... text...
我想要的输出:OriginalString of text...
就算我要换str.length
with mod.length
and edits.length
like:
// 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:
你如何找到两个字符串之间的变化?
I'm dealing with large pieces of text each could be about a megabyte hundred kilobytes. This is running on the browser