【发布时间】:2015-08-21 17:30:21
【问题描述】:
我将深入探讨我的问题,如果您不想阅读所有这些内容,可以跳转到 TL;DR
我想要做什么
我需要存储一个用户可以编辑的“文件”(文本文档)。如果我有我的原始文件(可能很大)
Lorem ipsum dolor sit amet
并且用户要做出改变:
Foo ipsum amet_sit
基本上,我有原始字符串和用户编辑的字符串。我想找出不同之处,“edits”。防止存储 very large 字符串的重复项。我想存储原件和“编辑”。然后将编辑应用到原件。有点像重复数据删除。问题是我不知道编辑可以有多么不同,我还需要能够将这些编辑应用于字符串。
尝试
因为文本可能很大,我想知道在不存储两个单独版本的情况下存储文本编辑的最“有效”方式是什么。我的第一个猜测是:
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...。输出还是一样的。
我可以看到他们在我这样做的方式上有很多缺陷,但我想不出任何其他方式。
片段:
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:
你如何找到两个字符串之间的变化?
我正在处理大段的文本,每段可能大约有 兆字节 百千字节。这是在浏览器上运行的
【问题讨论】:
-
您使用的是什么操作系统?这是浏览器还是通用(服务器端)JavaScript? node.js 可用吗?
-
@orb 不,这是客户端 javascript。
-
@vihan1086 你为什么需要这个。您正在存储原件,然后用编辑替换原件。那么为什么不直接用用户编辑的文本替换原始文本呢?最后你会得到相同的结果。由用户修改的文本。为什么您需要将编辑保存在某个地方。尤其是当原版无论如何都会被销毁时。
-
例如,原文:
today was a good day。用户编辑:today was a OK day。 (现在你想)保存;-good +OK然后应用到原文today was a good day到today was a OK day。现在您有了全文:today was a OK day,并保存了“-good +OK”编辑。所以我问为什么?回到历史? -
@MuhammadUmer 我确实需要同时使用原始版本和修改版本。
标签: javascript file storage edit safari-extension