| 'use strict'; |
| |
| // 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; |
| } |