|  | var arrayMap = require('./_arrayMap'), | 
|  | baseIndexOf = require('./_baseIndexOf'), | 
|  | baseIndexOfWith = require('./_baseIndexOfWith'), | 
|  | baseUnary = require('./_baseUnary'), | 
|  | copyArray = require('./_copyArray'); | 
|  |  | 
|  | /** Used for built-in method references. */ | 
|  | var arrayProto = Array.prototype; | 
|  |  | 
|  | /** Built-in value references. */ | 
|  | var splice = arrayProto.splice; | 
|  |  | 
|  | /** | 
|  | * The base implementation of `_.pullAllBy` without support for iteratee | 
|  | * shorthands. | 
|  | * | 
|  | * @private | 
|  | * @param {Array} array The array to modify. | 
|  | * @param {Array} values The values to remove. | 
|  | * @param {Function} [iteratee] The iteratee invoked per element. | 
|  | * @param {Function} [comparator] The comparator invoked per element. | 
|  | * @returns {Array} Returns `array`. | 
|  | */ | 
|  | function basePullAll(array, values, iteratee, comparator) { | 
|  | var indexOf = comparator ? baseIndexOfWith : baseIndexOf, | 
|  | index = -1, | 
|  | length = values.length, | 
|  | seen = array; | 
|  |  | 
|  | if (array === values) { | 
|  | values = copyArray(values); | 
|  | } | 
|  | if (iteratee) { | 
|  | seen = arrayMap(array, baseUnary(iteratee)); | 
|  | } | 
|  | while (++index < length) { | 
|  | var fromIndex = 0, | 
|  | value = values[index], | 
|  | computed = iteratee ? iteratee(value) : value; | 
|  |  | 
|  | while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { | 
|  | if (seen !== array) { | 
|  | splice.call(seen, fromIndex, 1); | 
|  | } | 
|  | splice.call(array, fromIndex, 1); | 
|  | } | 
|  | } | 
|  | return array; | 
|  | } | 
|  |  | 
|  | module.exports = basePullAll; |