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.
42 lines
1.3 KiB
42 lines
1.3 KiB
var aCallable = require('../internals/a-callable'); |
|
var toObject = require('../internals/to-object'); |
|
var IndexedObject = require('../internals/indexed-object'); |
|
var lengthOfArrayLike = require('../internals/length-of-array-like'); |
|
|
|
var $TypeError = TypeError; |
|
|
|
// `Array.prototype.{ reduce, reduceRight }` methods implementation |
|
var createMethod = function (IS_RIGHT) { |
|
return function (that, callbackfn, argumentsLength, memo) { |
|
aCallable(callbackfn); |
|
var O = toObject(that); |
|
var self = IndexedObject(O); |
|
var length = lengthOfArrayLike(O); |
|
var index = IS_RIGHT ? length - 1 : 0; |
|
var i = IS_RIGHT ? -1 : 1; |
|
if (argumentsLength < 2) while (true) { |
|
if (index in self) { |
|
memo = self[index]; |
|
index += i; |
|
break; |
|
} |
|
index += i; |
|
if (IS_RIGHT ? index < 0 : length <= index) { |
|
throw $TypeError('Reduce of empty array with no initial value'); |
|
} |
|
} |
|
for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) { |
|
memo = callbackfn(memo, self[index], index, O); |
|
} |
|
return memo; |
|
}; |
|
}; |
|
|
|
module.exports = { |
|
// `Array.prototype.reduce` method |
|
// https://tc39.es/ecma262/#sec-array.prototype.reduce |
|
left: createMethod(false), |
|
// `Array.prototype.reduceRight` method |
|
// https://tc39.es/ecma262/#sec-array.prototype.reduceright |
|
right: createMethod(true) |
|
};
|
|
|