reduce.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. var optimizeCb = require('./optimizeCb');
  2. var isArrLike = require('./isArrLike');
  3. var isUndef = require('./isUndef');
  4. var keys = require('./keys');
  5. exports = createReduce(1);
  6. exports.create = createReduce;
  7. function createReduce(dir) {
  8. return function(obj, iterator, initial, ctx) {
  9. iterator = optimizeCb(iterator, ctx);
  10. var i, len, key;
  11. if (isArrLike(obj)) {
  12. len = obj.length;
  13. i = dir > 0 ? 0 : len - 1;
  14. if (isUndef(initial)) {
  15. initial = obj[i];
  16. i += dir;
  17. }
  18. for (; i < len && i >= 0; i += dir) {
  19. initial = iterator(initial, obj[i], i, obj);
  20. }
  21. } else {
  22. var _keys = keys(obj);
  23. len = _keys.length;
  24. i = dir > 0 ? 0 : len - 1;
  25. if (isUndef(initial)) {
  26. initial = obj[_keys[i]];
  27. i += dir;
  28. }
  29. for (; i < len && i >= 0; i += dir) {
  30. key = _keys[i];
  31. initial = iterator(initial, obj[key], key, obj);
  32. }
  33. }
  34. return initial;
  35. };
  36. }
  37. module.exports = exports;