2016-01-04 21 views
6

Sto osservando questo esempio di uso della funzione reduce().JavaScript - esempi di funzione reduce()

function add(runningTotal, currentValue) { 
    return runningTotal + currentValue; 
} 

var nums = [1,2,3,4,5,6,7,8,9,10]; 
var sum = nums.reduce(add); 
print(sum); // displays 55 

Potresti darmi mostrano alcuni altri esempi di utilizzo di ridurre() - Non sono sicuro pienamente seguo come funziona.

Grazie

+1

Cosa c'è che non va nell'esempio che hai fornito? – Sampson

+0

Qualsiasi altro esempio potrebbe confondervi di più. Questo esempio è l'uso più basilare e facilmente comprensibile. – Barmar

+1

Dai un'occhiata a questo. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce – Shyju

risposta

9

Che riduce fa è prendere un initialValue, un function con 2 parametri essenziali (può prendere più) e a list di valori. Se non viene fornito il numero initialValue, si presume che sia il primo elemento dell'elenco. La funzione dovrebbe fare qualcosa con lo previousValue solitamente usato come accumulatore e lo nextValue.

Quindi, si supponga di avere un elenco di valori: [1, 2, 3, 4, 5] e si supponga che la funzione aggiunga i 2 parametri e uno initialValue di 0.

Primo passo:

0 + 1 = 1 
    2 
    3 
    4 
    5 

Secondo passo:

1 + 2 = 3 
    3 
    4 
    5 

Terzo passo:

3 + 3 = 6 
    4 
    5 

Quarto passo:

6 + 4 = 10 
    5 

Quinto passo:

10 + 5 = 15 //Final value 

Come si può vedere, l'input passato da un list ad un singolo valore, da cui il nome reduce. Nel tuo esempio, non c'è lo initialValue (questo è il secondo argomento), quindi è come se fosse iniziato il secondo passo. .

+0

Penso che abbia senso ora. Non è molto diverso da: function myAdd (arr) { var sum = 0; per (var i = 0; i Wasteland

+0

Giusto per produrre lo stesso risultato, tuttavia si noti che 'reduce' è più generico. Nel mio esempio, 'x + y' su ogni passo, questa è la funzione fornita. Sta davvero facendo 'f (x, y)' ad ogni passo. 'f' può essere molto più che sommare valori. – MinusFour

2

È possibile impostare secondo argomento per ridurre

function add(runningTotal, currentValue) { 
 
    return runningTotal + currentValue; 
 
} 
 
var someInitValue = 10 
 
var nums = [1,2,3,4,5,6,7,8,9,10]; 
 
var sum = nums.reduce(add, someInitValue); 
 
console.log(sum); // displays 65

+0

E anche oltre - ha senso specificare sempre il valore iniziale. – zerkms

3

reduce() opere iterazione di un array e chiamare una funzione riduttore (questa funzione è il primo argomento passato reduce() Questa funzione ha quattro argomenti

  • previousValue, che è una sorta di 'totale corrente' . questo è inizialmente definito, a meno che non si fornisce un valore di seme come secondo argomento al reduce().
  • currentValue che è un oggetto nella propria matrice
  • index del valore corrente nella propria matrice
  • array, la matrice stessa

quando la funzione di riduttore viene chiamata, il suo valore di ritorno diventa il nuovo previousValue argomento per la prossima volta la funzione di riduttore è chiamato. questa è la magia.dopo che la funzione reductor viene chiamata e viene fornito l'ultimo oggetto nella matrice, il suo valore restituito sarà il valore restituito di reduce().

onestamente, molti esempi che vedrete (come l'uso di reduce() per riassumere un mucchio di numeri interi) sono piuttosto facili da fare con un ciclo for(). il suo vero valore è quando stai facendo functional programming.

1

È inoltre possibile utilizzare ridurre per fare cose come generare una sorta di codice di flusso.

var plaintext = "thisisaplaintext"; 
var chars = plaintext.split(''); 
var result = ''; 
function encrypt(runningTotal, currentValue){ 
    var newVal = ((runningTotal + (""+runningTotal).charCodeAt()-32) % 94)+32 
    result = result + String.fromCharCode(newVal) 
    return newVal; 
} 
chars.reduce(encrypt, 15 /*any arbitrary starting value*/); 
console.log(result); 

Fondamentalmente, tutto ciò che può essere fatto con una combinazione di calcoli indipendenti o qualsiasi cosa che richiede un certo totale laminazione. Non è niente che non potresti già fare con un ciclo for, ma sembra più pulito.