You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.1 KiB
39 lines
1.1 KiB
2 years ago
|
var optimizeCb = require('./optimizeCb');
|
||
|
var isArrLike = require('./isArrLike');
|
||
|
var isUndef = require('./isUndef');
|
||
|
var keys = require('./keys');
|
||
|
exports = createReduce(1);
|
||
|
exports.create = createReduce;
|
||
|
function createReduce(dir) {
|
||
|
return function(obj, iterator, initial, ctx) {
|
||
|
iterator = optimizeCb(iterator, ctx);
|
||
|
var i, len, key;
|
||
|
if (isArrLike(obj)) {
|
||
|
len = obj.length;
|
||
|
i = dir > 0 ? 0 : len - 1;
|
||
|
if (isUndef(initial)) {
|
||
|
initial = obj[i];
|
||
|
i += dir;
|
||
|
}
|
||
|
for (; i < len && i >= 0; i += dir) {
|
||
|
initial = iterator(initial, obj[i], i, obj);
|
||
|
}
|
||
|
} else {
|
||
|
var _keys = keys(obj);
|
||
|
len = _keys.length;
|
||
|
i = dir > 0 ? 0 : len - 1;
|
||
|
if (isUndef(initial)) {
|
||
|
initial = obj[_keys[i]];
|
||
|
i += dir;
|
||
|
}
|
||
|
for (; i < len && i >= 0; i += dir) {
|
||
|
key = _keys[i];
|
||
|
initial = iterator(initial, obj[key], key, obj);
|
||
|
}
|
||
|
}
|
||
|
return initial;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = exports;
|