将两个被操纵的字符串同步为一个

时间:2016-10-29 16:08:37

标签: javascript merge

如果我有一个以两种不同的方式变异的字符串,有没有什么方法可以将这些变成一个,只用一个函数,使用原始的和两个变异的?就像github中的自动合并一样?

输入/输出示例:

原文:"我有一条船",

Mut1:"我有船" - 删除" a"

Mut1:"我有一条船,很酷。" - 添加",酷"

- > "我有船,很酷。" - 两个变化包括

为什么我要这样:

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

1 个答案:

答案 0 :(得分:0)

String.prototype.match()RegExp /[a-z,.!?;]+/ig一起使用,以创建原始字符串的原始和后续变体数组,匹配字母,单词和标点符号。迭代Array.prototype.entries()返回的原始字符串的最后一个变异数组的.match(),以利用源数组元素的index作为.entries()for..of返回的原始数组环。 在for..of循环内使用逻辑来检查当前字母或单词索引是否等于包含标点符号的原始字符串索引处的单词;或者等于没有标点符号的原始字符串索引处的单词; 2)等于当前索引处原始字符串的先前变异; 3)当前索引处原始字符串的先前突变为undefined;或4)当前指数不等于原始指数或当前指数;也就是说,有新的内容。将匹配推送到数组,使用带参数Array.prototype.join()的{​​{1}}形成基于原始字符串的变异字符串,以及原始字符串的先前和当前突变。



" "

const mergediffs = (...mutations) => {
  let [original, mut1, mut2, result] = [...mutations, []];
  // additional punctuation marks can be added to RegEx
  let [rgx, marks, re] = [/[a-z,.!?;]+/ig, /[,.!?]/g, ""];
  let [odata, m1data, m2data] = [original.match(rgx)
                                 , mut1.match(rgx)
                                 , mut2.match(rgx)];

  for (let currentMut of m2data.entries()) {
    let [index, curr] = currentMut;
    if (((curr === odata[index] 
         || curr.replace(marks, re) === odata[index])
         && curr.replace(marks, re) === m1data[index])
        || (m1data[index] === undefined 
            || curr !== odata[index] 
            && curr !== m1data[index] 
               || curr === m1data[index])) {
      result = [...result, curr]
    }
  }
  return result.join(" ")
}

let pre = document.querySelector("pre");
pre.textContent = mergediffs(
  "I have a boat"
  , "I have boat"
  , "I have a boat, cool"
);

pre.textContent += "\n" + mergediffs(
  "I have a boat"
  , "We have a monkey"
  , "We had a monkey, cool."
);