|                                                   |  | var arrayReduce = require('./_arrayReduce'),    baseEach = require('./_baseEach'),    baseIteratee = require('./_baseIteratee'),    baseReduce = require('./_baseReduce'),    isArray = require('./isArray');
/** * Reduces `collection` to a value which is the accumulated result of running * each element in `collection` thru `iteratee`, where each successive * invocation is supplied the return value of the previous. If `accumulator` * is not given, the first element of `collection` is used as the initial * value. The iteratee is invoked with four arguments: * (accumulator, value, index|key, collection). * * Many lodash methods are guarded to work as iteratees for methods like * `_.reduce`, `_.reduceRight`, and `_.transform`. * * The guarded methods are: * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, * and `sortBy` * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @param {*} [accumulator] The initial value. * @returns {*} Returns the accumulated value. * @see _.reduceRight * @example * * _.reduce([1, 2], function(sum, n) { *   return sum + n; * }, 0); * // => 3
 * * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { *   (result[value] || (result[value] = [])).push(key); *   return result; * }, {}); * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
 */function reduce(collection, iteratee, accumulator) {  var func = isArray(collection) ? arrayReduce : baseReduce,      initAccum = arguments.length < 3;
  return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);}
module.exports = reduce;
 |