2012-10-13 15 views
28

Eventuali duplicati:
array_count_values for javascript insteadJavaScript Raggruppa per Array

Diciamo che ho semplice array JavaScript come la seguente:

var array = ['Car', 'Car', 'Truck', 'Boat', 'Truck']; 

Voglio gruppo e conte di ognuno quindi mi aspetterei una mappa chiave/valore di:

{ 
    Car : 2, 
    Truck : 2, 
    Boat : 1 
} 
+3

hai provato qualcosa che non funziona? – haynar

+3

Non penso che questo sia un duplicato. Questa domanda è molto generica di quella di Php. –

+1

Non penso che questo sia un duplicato. Sto cercando una domanda e una risposta su Javascript, non capisco l'altra domanda che elenca solo il codice PHP. – Ande

risposta

49
var arr = [ 'Car', 'Car', 'Truck', 'Boat', 'Truck' ]; 
var hist = {}; 
arr.map(function (a) { if (a in hist) hist[a] ++; else hist[a] = 1; }); 
console.log(hist); 

risultati in

{ Car: 2, Truck: 2, Boat: 1 } 

questo funziona, anche:

hist = arr.reduce(function (prev, item) { 
    if (item in prev) prev[item] ++; 
    else prev[item] = 1; 
    return prev; 
}, {}); 
+0

la prima soluzione non funziona per valori che non sono compatibili con nomi di variabili come GUID o interi, sebbene sia ottimo –

+7

Solo una nota, secondo https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Riferimento/Global_Objects/Array/map map crea una copia dell'array. Nel tuo caso non stai nemmeno usando quella copia, quindi sarà meglio farlo è così: arr.forEach (function (a) {if (a in hist) hist [a] ++, else hist [a] = 1;}) perché forEach non creerà una nuova copia – pretobomba

+1

Se stai usando Undescore, invece di 'arr.reduce' puoi anche provare _.countBy (elenco, iteratore) http://underscorejs.org/#countBy – Ande

3

è possibile scorrere ogni indice e salvarlo in un dizionario e incrementarlo quando viene trovato tutti quella chiave .

count = {}; 
for(a in array){ 
    if(count[array[a]])count[array[a]]++; 
    else count[array[a]]=1; 
} 

uscita sarà:

Boat: 1 
Car: 2 
Truck: 2