Врхунски водич за методе ЈаваСцрипт низа - Смањите

reduce()Метод смањује низ вредности до само једне вредности. Враћена појединачна вредност може бити било које врсте.

reduce()је попут швајцарског ножа арраи метода. Док се другима свиђа map()и filter()пружа специфична функционалност, они reduce()се могу користити за претварање улазног низа у било који излаз који желите, а све уз очување оригиналног низа.

Синтакса

const newValue = arr.reduce(function(accumulator, currentValue, index, array) { // Do stuff with accumulator and currentValue (index, array, and initialValue are optional) }, initialValue);
  • newValue - нови број, низ, низ или објекат који се враћа
  • arr - низ који се оперише
  • accumulator - враћена вредност претходне итерације
  • currentValue - тренутна ставка у низу
  • index - индекс тренутне ставке
  • array- оригинални низ на коме reduce()је позван
  • initialValue - број, низ, низ или објекат који служи као почетна вредност за евентуални излаз

Примери

ЕС5

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

ЕС6

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

Све о initialValue

initialValue Под условом

initialValueАргумент је опциони. Ако је наведен, користиће се као почетна вредност акумулатора ( total) у првом позиву функције повратног позива:

const numbers = [2, 3, 4]; const product = numbers.reduce((total, current) => { return total * current; }, 1); console.log(product); // 24

С обзиром на то initialValueда је 1 после функције повратног позива, reduce()започиње на почетку низа и поставља први елемент (2) као тренутну вредност ( current). Затим прелази кроз остатак низа, успут ажурирајући вредност акумулатора и тренутну вредност.

initialValue Изостављено

Ако initialValueније обезбеђена, итерација ће започети од другог елемента низа (у индексу 1), са accumulatorједнаким првим елементом у низу и currentValueједнаким другом елементу:

const numbers = [2, 3, 4]; const product = numbers.reduce((total, current) => { return total * current; }); console.log(product);

У овом примеру initialValueније предвиђено „но“, па reduce()први елемент низа поставља као вредност акумулатора ( totalједнако је 2), а други елемент низа поставља као тренутну вредност ( currentValueједнако 3). Затим прелази кроз остатак низа.

Када смањујете низ низова:

const strings = ['one', 'two', 'three']; const numberString = strings.reduce((acc, curr) => { return acc + ', ' + curr; }); console.log(numberString); // "one, two, three"

Иако је лако изоставити initialValueаргумент ако ће ваша reduce()метода вратити број или једноставан низ, требали бисте га укључити ако ће вратити низ или објекат.

Враћање објекта

Претварање низа низова у један објекат који показује колико се пута сваки низ појављује у низу је једноставно. Само додајте празан објекат ( {}) као 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 } */

Повратак и низ

Генерално, ако планирате да вратите низ, map()често је боља опција. Компајлеру (и другима који читају ваш код) говори да ће сваки елемент у оригиналном низу бити трансформисан и враћен као нови низ једнаке дужине.

С друге стране, reduce()указује да ће се сви елементи оригиналног низа трансформисати у нову вредност. Та нова вредност може бити низ чија дужина може бити другачија од изворне.

Рецимо да имате листу за куповину као низ жица, али желите да са листе уклоните сву храну која вам се не свиђа. Можете користити filter()за филтрирање свега што вам се не свиђа и map()за враћање новог низа низова, или можете једноставно користити 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"]

То је све што треба да знате о reduce()методи. Попут швајцарске војске, то није увек најбољи алат за тај посао. Али биће вам драго што га имате у задњем џепу кад вам заиста затреба.