From 0ef4aebec78eb3b2c9fe9e2ab7ce39cb55383738 Mon Sep 17 00:00:00 2001 From: Denning Date: Thu, 9 Apr 2015 10:07:45 -0700 Subject: [PATCH] Fix for issue #35 -- apply diffs for arrays --- index.js | 4 ++-- test/tests.js | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index dfcc39b..9dfaaa3 100644 --- a/index.js +++ b/index.js @@ -249,7 +249,7 @@ if (target && source && change && change.kind) { var it = target, i = -1, - last = change.path.length - 1; + last = change.path ? change.path.length - 1 : 0; while (++i < last) { if (typeof it[change.path[i]] === 'undefined') { it[change.path[i]] = (typeof change.path[i] === 'number') ? [] : {}; @@ -258,7 +258,7 @@ } switch (change.kind) { case 'A': - applyArrayChange(it[change.path[i]], change.index, change.item); + applyArrayChange(change.path ? it[change.path[i]] : it, change.index, change.item); break; case 'D': delete it[change.path[i]]; diff --git a/test/tests.js b/test/tests.js index 63f89a9..7172e02 100644 --- a/test/tests.js +++ b/test/tests.js @@ -482,4 +482,22 @@ describe('deep-diff', function() { }); + describe('regression test for bug #35', function() { + var lhs = ["a", "a", "a"]; + var rhs = ["a"]; + + it('can apply diffs between two top level arrays', function() { + var differences = deep.diff(lhs, rhs); + + /* We must apply the differences in reverse order, since the array indices + in the diff become stale/invalid if you delete elements from the array + whose indices are in ascending order */ + for (var i = differences.length - 1; i >= 0; i--) { + deep.applyChange(lhs, true, differences[i]); + } + + expect(lhs).to.eql(["a"]); + }); + }); + });