00001 var SetCache = require('./_SetCache'), 00002 arrayIncludes = require('./_arrayIncludes'), 00003 arrayIncludesWith = require('./_arrayIncludesWith'), 00004 cacheHas = require('./_cacheHas'), 00005 createSet = require('./_createSet'), 00006 setToArray = require('./_setToArray'); 00007 00009 var LARGE_ARRAY_SIZE = 200; 00010 00020 function baseUniq(array, iteratee, comparator) { 00021 var index = -1, 00022 includes = arrayIncludes, 00023 length = array.length, 00024 isCommon = true, 00025 result = [], 00026 seen = result; 00027 00028 if (comparator) { 00029 isCommon = false; 00030 includes = arrayIncludesWith; 00031 } 00032 else if (length >= LARGE_ARRAY_SIZE) { 00033 var set = iteratee ? null : createSet(array); 00034 if (set) { 00035 return setToArray(set); 00036 } 00037 isCommon = false; 00038 includes = cacheHas; 00039 seen = new SetCache; 00040 } 00041 else { 00042 seen = iteratee ? [] : result; 00043 } 00044 outer: 00045 while (++index < length) { 00046 var value = array[index], 00047 computed = iteratee ? iteratee(value) : value; 00048 00049 value = (comparator || value !== 0) ? value : 0; 00050 if (isCommon && computed === computed) { 00051 var seenIndex = seen.length; 00052 while (seenIndex--) { 00053 if (seen[seenIndex] === computed) { 00054 continue outer; 00055 } 00056 } 00057 if (iteratee) { 00058 seen.push(computed); 00059 } 00060 result.push(value); 00061 } 00062 else if (!includes(seen, computed, comparator)) { 00063 if (seen !== result) { 00064 seen.push(computed); 00065 } 00066 result.push(value); 00067 } 00068 } 00069 return result; 00070 } 00071 00072 module.exports = baseUniq;