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