MDN wants to talk to developers like you: https://qsurvey.mozilla.com/s3/8d22564490d8

Array.prototype.reduce()

Podsumowanie

Metoda reduce() wywołuje funkcję względem wartości przyrostowej z każdego wywołania i kolejnego elementu tablicy (od lewej do prawej) w celu sprowadzenia tej tablicy do pojedynczej wartości.

Składnia

arr.reduce(callback, [initialValue])

Parametry

callback
Funkcja wykonywana na każdej wartości w tablicy, przyjmuje cztery argumenty:
previousValue
 
Wartość zwróconą w ostatnim wywołaniu funkcji callback, lub initialValue, jeśli ta została dostarczona. (Patrz niżej.)
currentValue
Obecnie przetwarzany element w tablicy.
index
Indeks w tablicy obecnie przetwarzanego elementu.
array
Tablica, na której została wykonana funkcja reduce .
initialValue
Opcjonalne. Obiekt który będzie użyty jako pierwszy argument pierwszego wywołania funkcji callback.

Opis

reduce wykonuje funkcję callback raz dla każdego elementu występującego w tablicy, wyłączając dziury. Funkcja callback przyjmuje cztery argumenty: wartość początkową (lub wartość poprzedniego wywołania callback), wartość obecnego elementu, jego indeks, oraz tablicę na której zachodzi proces iteracji.

Przy pierwszym wywołaniu funkcji callback, previousValue oraz currentValue mogą przyjąć jedną z dwóch wartości. Jeżeli initialValue było dostarczone w wywołaniu, wtedy previousValue przyjmie wartość podaną jako initialValue, natomiast currentValue przyjmie wartość pierwszego elementu tablicy. Jeśli initialValue nie było podane, wtedy previousValue będzie miało wartość pierwszego elementu tablicy, natomiast currentValue będzie równe elementowi drugiemu.

Jeżeli tablica jest pusta oraz initialValue nie zostało dostarczone, będzie rzucony błąd TypeError. Jeśli natomiast tablica ma jeden tylko element (bez względu na jego pozycję) i initialValue nie zostało podane, lub dostarczono initialValue, ale tablica jest pusta, wtedy ta jedyna wartość zostanie zwrócona, bez wywoływania funkcji callback.

Przyjmijmy, że wystąpiło następujące wywolanie funkcji reduce:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
});

Funkcja callback będzie wywołana cztery razy, z argumentami i wartościami zwrotnymi przy każdym wołaniu jak następuje:

  previousValue currentValue index array wartość zwracana
pierwsze wywołanie 0 1 1 [0, 1, 2, 3, 4] 1
drugie wywołanie 1 2 2 [0, 1, 2, 3, 4] 3
trzecie wywołanie 3 3 3 [0, 1, 2, 3, 4] 6
czwarte wywołanie 6 4 4 [0, 1, 2, 3, 4] 10

Wartość zwrócona ostatecznie przez reduce będzie tą z ostatniego wywołania funcji callback (10).

Natomiast, jeśli dostarczylibyśmy wartość początkową jako drugi argument funkcji przekazanej do reduce, wynik wyglądałby jak poniżej:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
}, 10);
  previousValue currentValue index array wartość zwracana
pierwsze wywołanie 10 0 0 [0, 1, 2, 3, 4] 10
drugie wywołanie 10 1 1 [0, 1, 2, 3, 4] 11
trzecie wywołanie 11 2 2 [0, 1, 2, 3, 4] 13
czwarte wywołanie 13 3 3 [0, 1, 2, 3, 4] 16
piąte wywołanie 16 4 4 [0, 1, 2, 3, 4] 20

Tym razem wartość zwrócona przez reduce będzie wynosiła 20.

Przykłady

Przykład: Zsumowanie wszystkich wartości w tablicy.

var total = [0, 1, 2, 3].reduce(function(a, b) {
  return a + b;
});
// total == 6

Przykład: Spłaszczenie tablicy tablic

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
  return a.concat(b);
});
// flattened is [0, 1, 2, 3, 4, 5]

Polyfill

Array.prototype.reduce zostało dodane do standardu ECMA-262 w edycji piątej i jako takie może nie występować we wszystkich implementacji standardu. Można obejśc ten brak poprzez wstawienie poniższego kodu na początku skryptu, co pozwala na użycie reduce z implementacjami, które nie wspierają tej funkcji.

// Production steps of ECMA-262, Edition 5, 15.4.4.21
// Reference: http://es5.github.io/#x15.4.4.21
if (!Array.prototype.reduce) {
  Array.prototype.reduce = function(callback /*, initialValue*/) {
    'use strict';
    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');
    }
    var t = Object(this), len = t.length >>> 0, k = 0, value;
    if (arguments.length == 2) {
      value = arguments[1];
    } else {
      while (k < len && !(k in t)) {
        k++; 
      }
      if (k >= len) {
        throw new TypeError('Reduce of empty array with no initial value');
      }
      value = t[k++];
    }
    for (; k < len; k++) {
      if (k in t) {
        value = callback(value, t[k], k, t);
      }
    }
    return value;
  };
}

Specyfikacja

Specyfikacja Stan Komentarz
ECMAScript 5.1 (ECMA-262)
The definition of 'Array.prototype.reduce' in that specification.
Standard Definicja początkowa. Wprowadzon w JavaScript 1.8.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.reduce' in that specification.
Standard  

Wspierane przeglądarki

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support (Yes) 3.0 (1.9) 9 10.5 4.0
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

Zobacz też

Autorzy i etykiety dokumentu

 Autorzy tej strony: the0ffh, sqeeswy, kamce, thigrand
 Ostatnia aktualizacja: the0ffh,