From 7650f69446358aee8112e2919347028831d0743b Mon Sep 17 00:00:00 2001 From: "tzook.shaked" Date: Sat, 14 May 2016 00:44:16 +0300 Subject: [PATCH 1/2] Optimize "uniq" to be O(n) instead of O(n^2) --- underscore.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/underscore.js b/underscore.js index 4a0cf6e73..0f042499c 100644 --- a/underscore.js +++ b/underscore.js @@ -535,6 +535,7 @@ // been sorted, you have the option of using a faster algorithm. // Aliased as `unique`. _.uniq = _.unique = function(array, isSorted, iteratee, context) { + var hasMapSupported = typeof Map !== 'undefined'; if (!_.isBoolean(isSorted)) { context = iteratee; iteratee = isSorted; @@ -542,7 +543,7 @@ } if (iteratee != null) iteratee = cb(iteratee, context); var result = []; - var seen = []; + var seen = hasMapSupported ? new Map() : []; for (var i = 0, length = getLength(array); i < length; i++) { var value = array[i], computed = iteratee ? iteratee(value, i, array) : value; @@ -550,11 +551,14 @@ if (!i || seen !== computed) result.push(value); seen = computed; } else if (iteratee) { - if (!_.contains(seen, computed)) { - seen.push(computed); + if (hasMapSupported ? !seen.has(computed) : !_.contains(seen, computed)) { + hasMapSupported ? seen.set(computed) : seen.push(computed); result.push(value); } - } else if (!_.contains(result, value)) { + } else if (hasMapSupported ? !seen.has(value) : !_.contains(result, value)) { + if (hasMapSupported) { + seen.set(value); + } result.push(value); } } From e4620428175837f4471bde6d370764eb8a2743de Mon Sep 17 00:00:00 2001 From: "tzook.shaked" Date: Sat, 14 May 2016 01:04:09 +0300 Subject: [PATCH 2/2] Structure code to pass jslint --- underscore.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/underscore.js b/underscore.js index 0f042499c..58a006a8c 100644 --- a/underscore.js +++ b/underscore.js @@ -543,7 +543,7 @@ } if (iteratee != null) iteratee = cb(iteratee, context); var result = []; - var seen = hasMapSupported ? new Map() : []; + var seen = hasMapSupported ? new Map() : []; for (var i = 0, length = getLength(array); i < length; i++) { var value = array[i], computed = iteratee ? iteratee(value, i, array) : value; @@ -552,7 +552,11 @@ seen = computed; } else if (iteratee) { if (hasMapSupported ? !seen.has(computed) : !_.contains(seen, computed)) { - hasMapSupported ? seen.set(computed) : seen.push(computed); + if (hasMapSupported) { + seen.set(computed); + } else { + seen.push(computed); + } result.push(value); } } else if (hasMapSupported ? !seen.has(value) : !_.contains(result, value)) {