From 43c26b5d6f9d7ba971cf89c2582ac08d72007291 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Fri, 22 Apr 2016 22:01:29 -0700 Subject: [PATCH] Ensure matches methods match arrays with duplicate values. [closes #2270] --- lodash.js | 10 ++++++---- test/test.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/lodash.js b/lodash.js index 85472bba2..8bb686ad9 100644 --- a/lodash.js +++ b/lodash.js @@ -5010,10 +5010,12 @@ break; } // Recursively compare arrays (susceptible to call stack limits). - if (isUnordered) { - if (!arraySome(other, function(othValue) { - return arrValue === othValue || - equalFunc(arrValue, othValue, customizer, bitmask, stack); + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!seen.has(othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { + return seen.add(othIndex); + } })) { result = false; break; diff --git a/test/test.js b/test/test.js index 2b20e07fe..0ecdcd572 100644 --- a/test/test.js +++ b/test/test.js @@ -10437,9 +10437,23 @@ source = { 'a': ['d', 'b'] }; actual = lodashStable.filter(objects, predicate); + assert.deepEqual(actual, []); }); + QUnit.test('should partial match arrays with duplicate values', function(assert) { + assert.expect(1); + + var objects = [{ 'a': [1, 2] }, { 'a': [2, 2] }], + source = { 'a': [2, 2] }; + + var actual = lodashStable.filter(objects, function(object) { + return _.isMatch(object, source); + }); + + assert.deepEqual(actual, [objects[1]]); + }); + QUnit.test('should partial match arrays of objects', function(assert) { assert.expect(1); @@ -13630,6 +13644,15 @@ assert.deepEqual(actual, []); }); + QUnit.test('should partial match arrays with duplicate values', function(assert) { + assert.expect(1); + + var objects = [{ 'a': [1, 2] }, { 'a': [2, 2] }], + actual = lodashStable.filter(objects, _.matches({ 'a': [2, 2] })); + + assert.deepEqual(actual, [objects[1]]); + }); + QUnit.test('should partial match arrays of objects', function(assert) { assert.expect(1); @@ -14075,6 +14098,15 @@ assert.deepEqual(actual, []); }); + QUnit.test('should partial match arrays with duplicate values', function(assert) { + assert.expect(1); + + var objects = [{ 'a': [1, 2] }, { 'a': [2, 2] }], + actual = lodashStable.filter(objects, _.matchesProperty('a', [2, 2])); + + assert.deepEqual(actual, [objects[1]]); + }); + QUnit.test('should partial match arrays of objects', function(assert) { assert.expect(1);