Javascript 函数将两个已处理字符串同步为一个字符串

Javascript 函数将两个已处理字符串同步为一个字符串,javascript,merge,Javascript,Merge,如果我有一个字符串,它以两种不同的方式进行了变异,有没有任何方法可以将它们组合成一个,只使用一个函数,使用原始函数和两个变异函数?像github中的自动合并 输入/输出示例: 原文:“我有一条船” Mut1:“我有船”-删除“a” Mut1:“我有一条船,酷。”-加上“酷” ->“我有船,很酷。”-两个变化都包括在内 我为什么想要这个: 我有一个webapp,多人可以编辑文本,每隔10秒软件就会在数据库中查找更新。因此,如果有人正在编辑文本(更改1),而其他人已更新文本(更改2),则原始文本仍保

如果我有一个字符串,它以两种不同的方式进行了变异,有没有任何方法可以将它们组合成一个,只使用一个函数,使用原始函数和两个变异函数?像github中的自动合并

输入/输出示例:

原文:“我有一条船”

Mut1:“我有船”-删除“a”

Mut1:“我有一条船,酷。”-加上“酷”

->“我有船,很酷。”-两个变化都包括在内

我为什么想要这个:


我有一个webapp,多人可以编辑文本,每隔10秒软件就会在数据库中查找更新。因此,如果有人正在编辑文本(更改1),而其他人已更新文本(更改2),则原始文本仍保存在当前编辑文本的人处。这样您就知道change1和change2是基于原始文本的。当更新(change2)到执行change1的人时,我想合并这两个文本。

使用
String.prototype.match()
RegExp
/[a-z,.!?;]+/ig创建原始字符串、匹配字母、单词和标点符号的原始和后续突变数组。迭代
Array.prototype.entries()
.match()
返回的原始字符串的最后一个变异数组的
Array.prototype.entries()
,以利用源数组元素的
索引
,作为
.entries()
循环的..处返回的原始数组。
在
for..of
循环中,使用逻辑检查当前字母或单词索引是否等于原始字符串索引处的单词,包括标点符号;或等于原始字符串索引处的单词,无标点符号;2) 并等于当前索引处原始字符串的上一次变异;3) 当前索引处原始字符串的上一次变异是
未定义的
;或4)当前索引不等于原始索引或当前索引;也就是说,有了新的内容。将匹配项推送到一个数组中,使用带有参数
“”
array.prototype.join()
,根据原始字符串以及原始字符串以前和当前的突变形成突变字符串

const mergediff=(…突变)=>{
让[原始,mut1,mut2,结果]=[…突变,[];
//可以向正则表达式中添加其他标点符号
设[rgx,marks,re]=[/[a-z,.!?;]+/ig,/[,.!?]/g,”;
让[odata,m1data,m2data]=[original.match(rgx)
,mut1.match(rgx)
,mut2.匹配(rgx)];
for(让m2data.entries()的currentMut){
let[index,curr]=currentMut;
如果((当前===odata[索引]
||当前替换(标记,re)==odata[索引])
&&当前替换(标记,re)==m1数据[索引])
||(m1data[索引]==未定义
||curr!==odata[索引]
&&curr!==m1数据[索引]
||curr==m1数据[索引]){
结果=[…结果,当前]
}
}
返回结果。join(“”)
}
let pre=document.querySelector(“pre”);
pre.textContent=mergediff(
“我有一条船”
“我有一条船”
“我有一条船,酷”
);
pre.textContent+=“\n”+合并差异(
“我有一条船”
“我们有一只猴子”
“我们有一只猴子,很酷。”
);

给出一个输入和输出示例!我添加了一个示例。字符串在JavaScript中是不可变的。当然,您可以将一个新字符串重新分配给已经有字符串的变量。“但那不是突变。”特林科特是的,当然,我在那里错误地表达了我自己。声明我更改它,然后将其分配给一个新变量。@guest271314无需选择,用户将同时需要这两个变量。仅仅使用索引是不够的,因为应用一个编辑已经改变了索引。您可能想发布一个答案来说明这是如何工作的。例如:Org:“我有一条船”,mut1:“我有一只猴子”,mut2:“我有一只猴子,很酷”,其中返回了“酷”。@Ferus
“cool”
在原始示例中也作为突变的一部分返回。序列的预期结果是什么;以及决定预期结果顺序的逻辑?你是什么意思?我在问题中指定的示例似乎适用于您的代码。但是如果我举一个例子,其中“我有一条船”是原始的,突变1是“我们有一只猴子”,突变2是“我有一条船,很酷”,那么预期的结果是“我们有一只猴子,很酷”,但是您的代码返回“很酷”,为什么
“boat”
不是预期的返回值?
“a”
at
“a cool”
是唯一一个不应该包含在结果中的字母吗?突变1改变了“I”->“We”,“Boat”->“Monkey”,第二次突变改变了“Have”->“Had”,最后加上了“cool”。