2013-04-17 40 views
46

mi hanno definito un variabili JavaScript chiamato myData che è un new Array come questo:valori Somma da un array in JavaScript

var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0], 
      ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], 
      ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], 
      ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]); 

Mi chiedo se è possibile sommare i valori numerici presenti nella matrice (ex 0 + 0 + 21 + 2 + 0 e così via) e probabilmente ho una variabile con il risultato che posso usare al di fuori del tag dello script perché ho 7 di questo tipo di array corrispondenti per ogni giorno della settimana. Voglio fare un confronto in seguito sulla base di ciò. Questo è il metodo più preferito per questo tipo di azioni se è possibile?

+0

iterare matrice e aggiungere i secondi elementi delle matrici interne. –

risposta

18

provare il seguente

var myData = [['2013-01-22', 0], ['2013-01-29', 1], ['2013-02-05', 21]]; 
 

 
var myTotal = 0; // Variable to hold your total 
 

 
for(var i = 0, len = myData.length; i < len; i++) { 
 
    myTotal += myData[i][1]; // Iterate over your first array and then grab the second element add the values up 
 
} 
 

 
document.write(myTotal); // 22 in this instance

+0

Penso che intendessi 'myData [i] [1]'. E perché usare 'parseFloat' se il valore è già un numero? –

+0

emette 24156 anziché come dovrebbe 3. Ho provato con un "array di valori vuoti" e ricevo la stessa uscita ... –

+0

@FelixKling funziona con 'myData [i] [1]' ma come faccio myTotal disponibile in altri tag di script? –

90

è possibile utilizzare il metodo Array.reduce:

var sum = myData.reduce(
      function(sum, current){ 
      return sum + current[1]; 
      }, 0 
     ); 

Vedi MDN

+0

Dovrebbe essere 'prev [1]' Suppongo. Con ogni mezzo il risultato non darà '23'. – VisioN

+4

@Kooilnc Si tenga presente che 'Array.reduce' è un'aggiunta di ECMAscript 5, quindi non è supportato da tutti i browser: vedere qui https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/ Array/Reduce che include anche un codice che può essere implementato per superare questo –

+1

@VisioN: dimenticato il valore iniziale, aggiunto. E no, non dovrebbe essere 'prev [1]' @MarkWalters: si, ma si può usare lo shim dal collegamento MDN (vedere la risposta) – KooiInc

12

userei reduce

var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0], ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]); 

var sum = myData.reduce(function(a, b) { 
    return a + b[1]; 
}, 0); 

$("#result").text(sum); 

Disponibile su jsfiddle

0

Il javascript incorporato ridurre per array non è uno standard, ma è possibile utilizzare underscore.js:

var data = _.range(10); 
var sum = _(data).reduce(function(memo, i) {return memo + i}); 

che diventa

var sumMyData = _(myData).reduce(function(memo, i) {return memo + i[1]}, 0); 

per il tuo caso. Date un'occhiata anche a questo fiddle.

2

Se si desidera eliminare la matrice, allo stesso tempo, come somma, si potrebbe fare (per esempio, stack è la matrice):

var stack = [1,2,3], 
    sum = 0; 
while(stack.length > 0) { sum += stack.pop() }; 
11

La creazione di un metodo di somma avrebbe funzionato bene, per esempio si potrebbe aggiungere la funzione somma Array

Array.prototype.sum = function(selector) { 
    if (typeof selector !== 'function') { 
     selector = function(item) { 
      return item; 
     } 
    } 
    var sum = 0; 
    for (var i = 0; i < this.length; i++) { 
     sum += parseFloat(selector(this[i])); 
    } 
    return sum; 
}; 

allora si potrebbe fare

> [1,2,3].sum() 
6 

e nel tuo caso

> myData.sum(function(item) { return item[1]; }); 
23 

Edit: L'ampliamento dei comandi incorporati può essere visto di buon occhio, perché se tutti facessero otterremmo cose che si sovrappongono in modo imprevisto l'un l'altro (collisioni nello spazio dei nomi). è possibile aggiungere la funzione somma a qualche modulo e accettare un array come argomento, se lo si desidera. che potrebbe significare cambiare la firma per myModule.sum = function(arr, selector) { poi this sarebbe diventato arr

53

Penso che il modo più semplice potrebbe essere:

values.reduce(function(a, b){return a+b;}) 
+6

Questa dovrebbe essere la risposta accettata alla domanda generale posta, ma il poster aveva una struttura dati che purtroppo non avrebbe funzionato con questo. Questo è esattamente il modo migliore per gestire una serie di numeri attraverso – netpoetica

+1

Assicurandosi che i numeri non facciano male: values.reduce (function (a, b) {return + a + + b;}) –

+1

@netpoetica 'myData.map (function (o) {return o [1];}). reduce (a, b) {return a + b; }) ' –

1

È possibile utilizzare il metodo mappa nativo per array. map Method (Array) (JavaScript)

var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0], 
      ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], 
      ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], 
      ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]); 
var a = 0; 
myData.map(function(aa){ a += aa[1]; return a; }); 

a è il risultato

5

O in ES6

values.reduce((a, b) => a + b),

esempio:

[1,2,3].reduce((a, b)=>a+b) // return 6 
0

Vecchio modo (se non lo fai ora la lunghezza argomenti/parametri)

>> function sumla1(){ 

    result=0 
    for(let i=0; i<arguments.length;i++){ 

     result+=arguments[i]; 

    } 
    return result; 
    } 
    >> sumla1(45,67,88); 
    >> 200 

ES6 (destrutturazione di matrice)

>> function sumla2(...x){return x.reduce((a,b)=>a+b)} 
>> 
>> sumla2(5,5,6,7,8) 
>> 
>> 31 
>> 
>> var numbers = [4, 9, 16, 25]; 
>> sumla2(...numbers); 
>> 54 
Problemi correlati