diff --git a/Libraries/Utilities/differ/__tests__/deepDiffer-test.js b/Libraries/Utilities/differ/__tests__/deepDiffer-test.js index 6fadfdbe5..4fb31ee05 100644 --- a/Libraries/Utilities/differ/__tests__/deepDiffer-test.js +++ b/Libraries/Utilities/differ/__tests__/deepDiffer-test.js @@ -98,4 +98,16 @@ describe('deepDiffer', function() { var obj = [1,[2,3]]; expect(deepDiffer(obj, obj)).toBe(false); }); + it('should respect maxDepth arg', () => { + expect(deepDiffer( + {a: {A: {aA: 1, bB: 1}}, b: 1}, + {a: {A: {aA: 1, bB: 1}}, b: 1}, + 3 + )).toBe(true); + expect(deepDiffer( + {a: {A: {aA: 1, bB: 1}}, b: 1}, + {a: {A: {aA: 1, bB: 1}}, b: 1}, + 4 + )).toBe(false); + }); }); diff --git a/Libraries/Utilities/differ/deepDiffer.js b/Libraries/Utilities/differ/deepDiffer.js index 700733f51..f3f826fe9 100644 --- a/Libraries/Utilities/differ/deepDiffer.js +++ b/Libraries/Utilities/differ/deepDiffer.js @@ -11,7 +11,10 @@ /* * @returns {bool} true if different, false if equal */ -var deepDiffer = function(one: any, two: any): bool { +var deepDiffer = function(one: any, two: any, maxDepth: number = -1): bool { + if (maxDepth === 0) { + return true; + } if (one === two) { // Short circuit on identical object references instead of traversing them. return false; @@ -39,13 +42,13 @@ var deepDiffer = function(one: any, two: any): bool { return true; } for (var ii = 0; ii < len; ii++) { - if (deepDiffer(one[ii], two[ii])) { + if (deepDiffer(one[ii], two[ii], maxDepth - 1)) { return true; } } } else { for (var key in one) { - if (deepDiffer(one[key], two[key])) { + if (deepDiffer(one[key], two[key], maxDepth - 1)) { return true; } }