2014-12-31 17 views
8

Sto cercando un modello per ottenere i totali per ogni n-esimo elemento di array. Concettualmente questo sarebbe come ottenere i totali delle colonne di una tabella di dati.Motivo per "colonna totale" di una matrice di matrici

var dataRows = [ 
    [10, 11, 12, 13], 
    [20, 21, 22, 23], 
    [30, 31, 32, 33] 
] 
// The outcome should be: 
// [ 60, 63, 66, 69] 

ho avuto qualche codice Python equivalente sul lato server, ma decise che dovrebbe essere gestito lato client, quindi in javascript. Ecco il codice Python equivalente:

[sum(i) for i in zip(*data_rows)] 

Come si va di scrivere questo? Sono sicuro che il codice sarà più lungo senza zip, decomprimere ed elencare la comprensione, ma può essere fatto elegantemente? Ci sono anche librerie che estendono la libreria principale di JS?

risposta

7

Basta iterare gli array:

var dataRows = [ 
 
    [10, 11, 12, 13], 
 
    [20, 21, 22, 23], 
 
    [30, 31, 32, 33] 
 
] 
 

 
var result = []; 
 

 
for(var i = 0; i < dataRows.length; i++){ 
 
    for(var j = 0; j < dataRows[i].length; j++){ 
 
     result[j] = (result[j] || 0) + dataRows[i][j]; 
 
    } //^Add the current value to the proper position of `result`. 
 
} 
 

 
alert(JSON.stringify(result));

Per quanto riguarda la seconda parte della tua domanda:
Ci sono biblioteche che aggiungono un sacco di funzioni di manipolazione array JS. Dai un'occhiata a Underscore, per esempio.

+0

Non sono sicuro di 'result [j] + dataRows [i] [j] || DataRow [i] [j]; '. Se il totale provvisorio arriva a zero (cioè risultato [j] + dataRows [i] [j] == 0'), assegnerai 'dataRows [i] [j]'. – RobG

+0

Grazie per questo. La soluzione che immaginavo avrebbe introdotto alcune variabili extra, ma la parte intelligente è che si scrivono i valori nell'array dei risultati. Pensavo che non stavo cercando qualche iterazione annidata, ma il modo in cui si codifica: credo di sì. Accettato elegante :) –

+0

@RobG: ho cambiato un po 'quella linea. Potete fornire alcuni dati che potrebbero causare problemi? Non sono sicuro di capire cosa stai ricevendo, correttamente. – Cerbrus

6

Giocare con i metodi di array ES5:

var dataRows = [ 
    [10, 11, 12, 13], 
    [20, 21, 22, 23], 
    [30, 31, 32, 33] 
]; 

dataRows.reduce(function(a, b) { 
    return a.map(function(el, i) { 
    return el + b[i]; 
    }); 
}); 
// [60, 63, 66, 69] 

Questo è il tentativo di dare un indizio, quindi non ho che fare con la gestione degli errori cosa.

+0

sì ero a 2 secondi di distanza dallo stesso – Rhumborl

+0

questa è la migliore risposta – sumit

+1

Tieni presente che questi metodi ('map' /' reduce') non sono supportati da versioni di IE precedenti a 9. E si interrompe se il i sotto-array non hanno tutti la stessa lunghezza. (Prova: 'var dataRows = [[10,5], [20]];') – Cerbrus

Problemi correlati