code: function reduce(arr, fn, accu) {
      if (typeof arr === 'object' && !Array.isArray(arr)) {
          for (var key in arr) {
              accu = fn(accu, arr[key], key);
          }
      } else {
          for(var i = 0; i < arr.length; i++) {
              accu = fn(accu, arr[i]);
          }
      }
      return accu;
  }
docs: /*
  Goal: Q+ = Q, Q+(Q) = Q
  Problem: newQ doesn't carry over Q methods, so Q.delay wouldn't work
  var newQ = function(x) {
  Use provided Q
  if (x && x.defer && x.reject) {
  Q = x;
  x = 'f3b642dc';
  }
  Set methods id it hasn't been done
  if (!Q.makePromise.prototype.eachSeries) {
  setMethods(Q);
  }
  Return the Q library or a promise
  if (x === 'f3b642dc') return Q;
  return Q(x);
  };
   Reduce function that accepts Arrays & Plain Objects