Skip to main content Accessibility Feedback

Array.reduce()

Pushes support back to at least IE6.

/**
 * Array.prototype.reduce() polyfill
 * Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
 * @author Chris Ferdinandi
 * @license MIT
 */
if (!Array.prototype.reduce) {
	Array.prototype.reduce = function (callback) {

		if (this === null) {
			throw new TypeError('Array.prototype.reduce called on null or undefined');
		}

		if (typeof callback !== 'function') {
			throw new TypeError(callback + ' is not a function');
		}

		// 1. Let O be ? ToObject(this value).
		var o = Object(this);

		// 2. Let len be ? ToLength(? Get(O, "length")).
		var len = o.length >>> 0;

		// Steps 3, 4, 5, 6, 7
		var k = 0;
		var value;

		if (arguments.length >= 2) {
			value = arguments[1];
		} else {
			while (k < len && !(k in o)) {
				k++;
			}

			// 3. If len is 0 and initialValue is not present,
			//    throw a TypeError exception.
			if (k >= len) {
				throw new TypeError( 'Reduce of empty array ' +
					'with no initial value' );
			}
			value = o[k++];
		}

		// 8. Repeat, while k < len
		while (k < len) {
			// a. Let Pk be ! ToString(k).
			// b. Let kPresent be ? HasProperty(O, Pk).
			// c. If kPresent is true, then
			//    i.  Let kValue be ? Get(O, Pk).
			//    ii. Let accumulator be ? Call(
			//          callbackfn, undefined,
			//          « accumulator, kValue, k, O »).
			if (k in o) {
				value = callback(value, o[k], k, o);
			}

			// d. Increase k by 1.
			k++;
		}

		// 9. Return accumulator.
		return value;
	}
}