Skip to content

Commit 2ce6f62

Browse files
committed
Use Set in _.uniq
1 parent 33812ac commit 2ce6f62

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

underscore.js

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
nativeKeys = Object.keys,
3333
nativeBind = FuncProto.bind;
3434

35+
3536
// Create a safe reference to the Underscore object for use below.
3637
var _ = function(obj) {
3738
if (obj instanceof _) return obj;
@@ -50,6 +51,20 @@
5051
} else {
5152
root._ = _;
5253
}
54+
55+
var InternalSet = root.Set;
56+
// Not even close to a Set shim
57+
if (typeof InternalSet != 'function') {
58+
InternalSet = function FakeSet() {
59+
this.data = [];
60+
};
61+
InternalSet.prototype.add = function(x) {
62+
this.data.push(x);
63+
};
64+
InternalSet.prototype.has = function(x) {
65+
return _.indexOf(this.data, x) >= 0;
66+
};
67+
}
5368

5469
// Current version.
5570
_.VERSION = '1.7.0';
@@ -505,19 +520,15 @@
505520
}
506521
if (iteratee != null) iteratee = _.iteratee(iteratee, context);
507522
var result = [];
508-
var seen = [];
523+
var seen = isSorted ? null : new InternalSet();
509524
for (var i = 0, length = array.length; i < length; i++) {
510525
var value = array[i],
511526
computed = iteratee ? iteratee(value, i, array) : value;
512527
if (isSorted) {
513528
if (!i || seen !== computed) result.push(value);
514529
seen = computed;
515-
} else if (iteratee) {
516-
if (!_.contains(seen, computed)) {
517-
seen.push(computed);
518-
result.push(value);
519-
}
520-
} else if (!_.contains(result, value)) {
530+
} else if (!seen.has(computed)) {
531+
seen.add(computed);
521532
result.push(value);
522533
}
523534
}

0 commit comments

Comments
 (0)