--- /dev/null
+var baseEach = require('./baseEach'),
+ baseIteratee = require('./baseIteratee'),
+ isArray = require('../isArray');
+
+/**
+ * Creates a function like `_.groupBy`.
+ *
+ * @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) {
+ var result = initializer ? initializer() : {};
+ iteratee = baseIteratee(iteratee);
+
+ if (isArray(collection)) {
+ var index = -1,
+ length = collection.length;
+
+ while (++index < length) {
+ var value = collection[index];
+ setter(result, value, iteratee(value), collection);
+ }
+ } else {
+ baseEach(collection, function(value, key, collection) {
+ setter(result, value, iteratee(value), collection);
+ });
+ }
+ return result;
+ };
+}
+
+module.exports = createAggregator;