Spaces:
Running
Running
; | |
// there's 3 implementations written in increasing order of efficiency | |
// 1 - no Set type is defined | |
function uniqNoSet(arr) { | |
var ret = []; | |
for (var i = 0; i < arr.length; i++) { | |
if (ret.indexOf(arr[i]) === -1) { | |
ret.push(arr[i]); | |
} | |
} | |
return ret; | |
} | |
// 2 - a simple Set type is defined | |
function uniqSet(arr) { | |
var seen = new Set(); | |
return arr.filter(function (el) { | |
if (!seen.has(el)) { | |
seen.add(el); | |
return true; | |
} | |
return false; | |
}); | |
} | |
// 3 - a standard Set type is defined and it has a forEach method | |
function uniqSetWithForEach(arr) { | |
var ret = []; | |
(new Set(arr)).forEach(function (el) { | |
ret.push(el); | |
}); | |
return ret; | |
} | |
// V8 currently has a broken implementation | |
// https://github.com/joyent/node/issues/8449 | |
function doesForEachActuallyWork() { | |
var ret = false; | |
(new Set([true])).forEach(function (el) { | |
ret = el; | |
}); | |
return ret === true; | |
} | |
if ('Set' in global) { | |
if (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) { | |
module.exports = uniqSetWithForEach; | |
} else { | |
module.exports = uniqSet; | |
} | |
} else { | |
module.exports = uniqNoSet; | |
} | |