diff-match-patch icon indicating copy to clipboard operation
diff-match-patch copied to clipboard

JavaScript: Diff is not iterable

Open JackuB opened this issue 5 years ago • 3 comments

There was a change in JS version https://github.com/google/diff-match-patch/commit/cd60d246aecf871367313c7cf6dc8814af32c5e3#diff-5270d640a6c9c1b0590326b029d71ec8R76 from plain Array to a diff_match_patch.Diff Object that's trying to emulate Array.

The new object is not iterable, which messes up for example with Array destructing:

const a = dmp.diff_main('abc', 'ab123c', false);
const [eq, str] = a[0]; // => Uncaught TypeError: a[0] is not iterable
  1. was this change necessary? Tested that plain array works just fine with current version
  2. To really emulate array here, adding [Symbol.iterator] would do the trick, but its browser support is questionable

JackuB avatar Sep 03 '18 20:09 JackuB

@NeilFraser A quick comment on whether the new JS API behaviour which breaks Array destructuring is intentional or whether it's a bug and will be fixed would be very helpful - thanks!

bebbi avatar Sep 19 '18 08:09 bebbi

I think the API behaviour change is not intentional Here is a fix that could help: After

/**
 * Emulate the output of a two-element array.
 * @return {string} Diff operation as a string.
 */
diff_match_patch.Diff.prototype.toString = function() {
  return this[0] + ',' + this[1];
};

add the following


if (typeof Symbol === 'function') {
    diff_match_patch.Diff.prototype[Symbol.iterator] = function* () {
      yield this[0];
      yield this[1];
    };
}

Another possible is to cast to a real Array:

const [eq, str] = Array.from(a[0]);

GrosSacASac avatar Jan 24 '19 16:01 GrosSacASac