reduce()
Način smanjuje niz vrijednosti dolje samo jedne vrijednosti. Vraćena pojedinačna vrijednost može biti bilo koje vrste.
reduce()
je poput švicarskog noža array metoda. Dok se drugima sviđa map()
i filter()
pruža određena funkcionalnost, reduce()
mogu se koristiti za pretvaranje ulaznog niza u bilo koji izlaz koji želite, a sve uz očuvanje izvornog niza.
Sintaksa
const newValue = arr.reduce(function(accumulator, currentValue, index, array) { // Do stuff with accumulator and currentValue (index, array, and initialValue are optional) }, initialValue);
newValue
- novi broj, niz, niz ili objekt koji se vraćaarr
- niz koji se operiraaccumulator
- vraćena vrijednost prethodne iteracijecurrentValue
- trenutna stavka u poljuindex
- indeks trenutne stavkearray
- izvorni niz na kojemreduce()
je pozvaninitialValue
- broj, niz, niz ili objekt koji služi kao početna vrijednost za eventualni izlaz
Primjeri
ES5
var numbers = [1, 2, 3]; var sum = numbers.reduce(function(total, current) { return total + current; }, 0); console.log(numbers); // [1, 2, 3] console.log(sum); // 6
ES6
const numbers = [1, 2, 3]; const sum = numbers.reduce((total, current) => { return total + current; }, 0); const sumOneLiner = numbers.reduce((total, current) => total + current, 0); console.log(numbers); // [1, 2, 3] console.log(sum); // 6 console.log(sumOneLiner); // 6
Sve o initialValue
initialValue
Pod uvjetom
initialValue
Argument je neobavezan. Ako je naveden, koristit će se kao početna vrijednost akumulatora ( total
) u prvom pozivu funkcije povratnog poziva:
const numbers = [2, 3, 4]; const product = numbers.reduce((total, current) => { return total * current; }, 1); console.log(product); // 24
Budući da je initialValue
1 nakon funkcije povratnog poziva, reduce()
započinje na početku niza i postavlja prvi element (2) kao trenutnu vrijednost ( current
). Zatim se ponavlja kroz ostatak niza, usput ažurirajući vrijednost akumulatora i trenutnu vrijednost.
initialValue
Izostavljeno
Ako initialValue
nije naveden, iteracija će započeti s drugim elementom u polju (s indeksom 1), s accumulator
jednakim prvom elementu u polju i currentValue
jednakim drugom elementu:
const numbers = [2, 3, 4]; const product = numbers.reduce((total, current) => { return total * current; }); console.log(product);
U ovom primjeru nije initialValue
naveden no, pa reduce()
prvi element niza postavlja kao vrijednost akumulatora ( total
jednak je 2), a drugi element niza postavlja kao trenutnu vrijednost ( currentValue
jednak je 3). Zatim se ponavlja kroz ostatak niza.
Prilikom smanjivanja niza nizova:
const strings = ['one', 'two', 'three']; const numberString = strings.reduce((acc, curr) => { return acc + ', ' + curr; }); console.log(numberString); // "one, two, three"
Iako je lako izostaviti initialValue
argument ako će vaša reduce()
metoda vratiti broj ili jednostavan niz, trebali biste ga uključiti ako će vratiti niz ili objekt.
Vraćanje objekta
Pretvaranje niza nizova u jedan objekt koji pokazuje koliko se puta svaki niz pojavljuje u nizu je jednostavno. Samo dodajte prazan objekt ( {}
) kao initialValue
:
const pets = ["dog", "chicken", "cat", "dog", "chicken", "chicken", "rabbit"]; const petCounts = pets.reduce(function(obj, pet) { if (!obj[pet]) { // if the pet doesn't yet exist as a property of the accumulator object, // add it as a property and set its count to 1 obj[pet] = 1; } else { // pet exists, so increment its count obj[pet]++; } return obj; // return the modified object to be used as accumulator in the next iteration }, {}); // initialize the accumulator as an empty object console.log(petCounts); /* { dog: 2, chicken: 3, cat: 1, rabbit: 1 } */
Povratak i niz
Općenito, ako planirate vratiti niz, map()
često je bolja opcija. Kompajleru (i drugima koji čitaju vaš kôd) govori da će svaki element u izvornom nizu biti transformiran i vraćen kao novi niz jednake duljine.
S druge strane, reduce()
ukazuje da će se svi elementi izvornog polja transformirati u novu vrijednost. Ta nova vrijednost mogla bi biti niz čija duljina može biti drugačija od izvorne.
Recimo da imate popis za kupnju kao niz žica, ali želite s popisa ukloniti svu hranu koja vam se ne sviđa. Možete koristiti filter()
za filtriranje svega što vam se ne sviđa i map()
za vraćanje novog niza nizova, ili možete jednostavno upotrijebiti reduce()
:
const shoppingList = ['apples', 'mangoes', 'onions', 'cereal', 'carrots', 'eggplants']; const foodsIDontLike = ['onions', 'eggplants']; const newShoppingList = shoppingList.reduce((arr, curr) => { if (!foodsIDontLike.includes(curr)) { arr.push(curr); } return arr; }, []); console.log(newShoppingList); // ["apples", "mangoes", "cereal", "carrots"]
To je sve što trebate znati o reduce()
metodi. Poput švicarske vojske, to nije uvijek najbolji alat za posao. No, bit će vam drago imati ga u stražnjem džepu kad vam zaista treba.