如何使Google差异匹配补丁更喜欢字符串末尾的更改?

Jak*_*mpl 16 javascript google-diff-match-patch

我正在使用diff_mainGoogle的DiffMatchPatch库的方法来获取差异,然后我在我的应用程序中使用.考虑这种情况:

旧字符串:

Tracker.Dependency.prototype.changed = function () {
   for (var id in this._dependentsById)
     this._dependentsById[id]._compute();
};
Run Code Online (Sandbox Code Playgroud)

新字符串:

Tracker.Dependency.prototype.changed = function () {
  for (var id in this._dependentsById)
    this._dependentsById[id]._compute();
};

Tracker.autorun = function (f) {
  constructingComputation = true;
  var c = new Tracker.Computation(f);
  return c;
};
Run Code Online (Sandbox Code Playgroud)

我得到的加法差异是:

;
};

Tracker.autorun = function (f) {
  constructingComputation = true;
  var c = new Tracker.Computation(f);
  return c
Run Code Online (Sandbox Code Playgroud)

然而,对于人类消费来说,似乎更合理的差异是:

Tracker.autorun = function (f) {
  constructingComputation = true;
  var c = new Tracker.Computation(f);
  return c;
};
Run Code Online (Sandbox Code Playgroud)

有什么方法可以让DiffMatchPatch产生第二个结果而不是第一个结果?

你可以在这里看到一个例子:https://jsfiddle.net/puje78vL/1/

Alv*_*ndo 8

我已经创建了一个JSFiddle基于库的作者示例页面(假设您需要基于问号标签的Javascript版本).

并使用此代码将给我你所期望的:

var dmp = new diff_match_patch();

function launch() {
  var text1 = document.getElementById('text1').value;
  var text2 = document.getElementById('text2').value;

  var d = dmp.diff_main(text1, text2);
  var ds = dmp.diff_prettyHtml(d);

  document.getElementById('outputdiv').innerHTML = ds;
}
Run Code Online (Sandbox Code Playgroud)

您还可以查看控制台并查看原始答案(数组),您还可以看到它diff_main正在返回您期望的内容.你在做一些不同的事吗?如果是这样,请分享您的代码.

新信息

现在你提供了全文我可以给你一个更好的答案:你看到的结果是好的,它只是算法的工作方式

我会试着向你解释发生了什么,以及如何解决这个问题.我们来看看每个文本的最后部分:

文字1

Tracker.Dependency.prototype.changed = function () {
  for (var id in this._dependentsById)
    this._dependentsById[id]._compute();
};
Run Code Online (Sandbox Code Playgroud)

文字2

Tracker.Dependency.prototype.changed = function () {
  for (var id in this._dependentsById)
    this._dependentsById[id]._compute();
};

Tracker.autorun = function (f) {
  constructingComputation = true;
  var c = new Tracker.Computation(f);
  return c;
};
Run Code Online (Sandbox Code Playgroud)

让我们注意这一点:

  1. 最后}; 文本1上的changed函数后面没有回车符.
  2. 最后}; 文本2changed上的函数的后面有回车符.
  3. 最后}; 文本2上的autorun函数后面没有回车符.

这样计算的diff算法将匹配13,使2所添加的文本.这就是tou获得输出的原因.

现在,为了获得所需的输出,您需要1与之匹配2.这意味着在文本1的末尾添加一个新的空行,您可以在巡视更新时看到JSFIddle:

Tracker.Dependency.prototype.changed = function () {
  for (var id in this._dependentsById)
    this._dependentsById[id]._compute();
};[PRESS ENTER HERE TO ADD NEW LINE]
Run Code Online (Sandbox Code Playgroud)

请注意,如果您只使用此文本,算法将正常工作(正如我在原始答案中所示).这是在你开始发生这种混淆时添加更多文本之后,不确定原因.