| var baseCallback = require('./baseCallback'), |
| baseEach = require('./baseEach'), |
| isArray = require('../lang/isArray'); |
| |
| /** |
| * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function. |
| * |
| * @private |
| * @param {Function} setter The function to set keys and values of the accumulator object. |
| * @param {Function} [initializer] The function to initialize the accumulator object. |
| * @returns {Function} Returns the new aggregator function. |
| */ |
| function createAggregator(setter, initializer) { |
| return function(collection, iteratee, thisArg) { |
| var result = initializer ? initializer() : {}; |
| iteratee = baseCallback(iteratee, thisArg, 3); |
| |
| if (isArray(collection)) { |
| var index = -1, |
| length = collection.length; |
| |
| while (++index < length) { |
| var value = collection[index]; |
| setter(result, value, iteratee(value, index, collection), collection); |
| } |
| } else { |
| baseEach(collection, function(value, key, collection) { |
| setter(result, value, iteratee(value, key, collection), collection); |
| }); |
| } |
| return result; |
| }; |
| } |
| |
| module.exports = createAggregator; |