【问题标题】:Function to synchronize two manipulated strings into one将两个操作字符串同步为一个的函数
【发布时间】:2017-03-12 06:53:20
【问题描述】:

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

输入/输出示例:

原文:《我有一条船》,

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

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

-> “我有船,很酷。” - 包括这两项更改

为什么我想要这个:

我有一个网络应用程序,多人可以在其中编辑文本,软件每 10 秒在数据库中查找更新。因此,如果有人正在编辑文本(change1)并且其他人已经更新了文本(change2),那么原始文本仍然保存在当前正在编辑文本的人处。这样你就知道 change1 和 change2 是基于原始文本的。当更新 (change2) 到执行 change1 的人时,我想合并这两个文本。

【问题讨论】:

  • 给个输入输出样例!
  • 我加了一个例子。
  • 字符串在 JavaScript 中是不可变的。您当然可以将新字符串重新分配给已经有字符串的变量。但那是不是突变。
  • @trincot 是的,当然,在那里表达自己不正确。我要更改它,然后将其分配给一个新变量。
  • @guest271314 无需选择,用户将需要两者。仅仅使用索引是不够的,因为应用一次编辑已经改变了索引。您可能想发布一个答案,说明这是如何工作的。

标签: javascript merge


【解决方案1】:

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

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."
);
<pre></pre>

【讨论】:

  • 似乎不起作用,例如:Org:“我有一条船”,mut1:“我有一只猴子”,mut2:“我有一只猴子,很酷”其中“很酷”被退回。
  • @Ferus "cool" 在作为突变的一部分包含在原始示例中时也会返回。该序列的预期结果是什么;以及确定预期结果顺序的逻辑?
  • 什么意思?我在问题中指定的示例似乎适用于您的代码。但是如果我以“我有一条船”为原始的例子,突变1是“我们有一只猴子”,而突变2是“我有一条船,很酷”,那么预期的结果是“我们有一只猴子” ,酷”,但您的代码返回“酷”
  • 为什么"boat" 不在预期的返回值中? "a" "a cool" 是唯一不应包含在结果中的字母吗?
  • Mutation 1 改变“I” -> “We”,“Boat” -> “Monkey”,第二个突变改变“Have” -> “Had”,最后添加“, cool”。
猜你喜欢
  • 1970-01-01
  • 2017-11-30
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
相关资源
最近更新 更多