diff --git a/index.js b/index.js index ce55325..27ea3e9 100644 --- a/index.js +++ b/index.js @@ -36,7 +36,7 @@ function compare(path, old, new_) { }); var delKeys = _.difference(oldKeys, newKeys); - delKeys.forEach(function (k) { + delKeys.reverse().forEach(function (k) { changes.push({ type: 'del', key: path.concat(k) }); }); diff --git a/test/index.js b/test/index.js index df6dc9e..20a2c49 100644 --- a/test/index.js +++ b/test/index.js @@ -40,18 +40,18 @@ describe('changeset', function () { var changes = diff(a, b); expect(changes).to.deep.equal([ - { type: 'put', key: ['name'], value: 'Susan' }, - { type: 'put', key: ['number'], value: 43 }, - { type: 'put', key: ['tags', '1'], value: 'tag4' }, - { type: 'del', key: ['tags', '2'] }, + { type: 'put', key: ['self'], value: b }, { type: 'put', key: [ 'scores', 'someArray', '1' ], value: 'three' }, { type: 'del', key: [ 'scores', 'someArray', '2' ] }, { type: 'del', key: ['scores', 'tetris'] }, { type: 'put', key: ['scores', 'zelda'], value: 3000 }, - { type: 'put', key: ['self'], value: b }, + { type: 'put', key: ['tags', '1'], value: 'tag4' }, + { type: 'del', key: ['tags', '2'] }, + { type: 'put', key: ['number'], value: 43 }, + { type: 'put', key: ['name'], value: 'Susan' }, { type: 'del', key: ['scoresAgain'], }, + { type: 'put', key: ['friend'], value: a }, { type: 'put', key: ['age'], value: 37 }, - { type: 'put', key: ['friend'], value: a } ]); done(); @@ -243,4 +243,18 @@ describe('changeset', function () { ]); done(); }); + + it('should sort array deletions from end', function() { + const a = ['a', 'b', 'c', 'd', 'e']; + const b = ['f', 'g']; + const changes = diff(a, b); + const delKeys = changes + .filter(change => change.type === 'del') + .map(change => change.key[0]); + + delKeys.reduce((prev, next) => { + expect(+prev).to.be.above(+next); + return next; + }); + }); });