reduce = function fastReduceObject(
    subject,
    fn,
    initialValue,
    thisContext
  ) {
    var keys = Object.keys(subject),
      length = keys.length,
      iterator =
        thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,
      i,
      key,
      result;

    if (initialValue === undefined) {
      i = 1;
      result = subject[keys[0]];
    } else {
      i = 0;
      result = initialValue;
    }

    for (; i < length; i++) {
      key = keys[i];
      result = iterator(result, subject[key], key, subject);
    }

    return result;
  }
# Reduce

A fast object `.reduce()` implementation.

@param  {Object}   subject      The object to reduce over.
@param  {Function} fn           The reducer function.
@param  {mixed}    initialValue The initial value for the reducer, defaults to subject[0].
@param  {Object}   thisContext  The context for the reducer.
@return {mixed}                 The final result.