2012-10-13 13 views
28

Powiel możliwe:
array_count_values for javascript insteadJavaScript Group By Array

Powiedzmy mam prostą tablicę JavaScript jak poniżej:

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

chcę grupy i zliczania każdy więc oczekiwałbym mapy klucza/wartości:

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

próbowałeś coś, co nie działa? – haynar

+3

Nie sądzę, że jest to duplikat. To pytanie jest znacznie bardziej ogólne niż pytanie Php. –

+1

Nie sądzę, że jest to duplikat. Szukam pytania i odpowiedzi na temat JavaScript, nie zrozumiem innego pytania, które wymienia tylko kod PHP. – Ande

Odpowiedz

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); 

skutkuje

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

To działa, TOO:

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

Pierwsze rozwiązanie nie działa dla wartości, które nie są zgodne z nazwami zmiennych, takimi jak GUID lub liczby całkowite, ale jest świetna –

+7

Tylko jedna uwaga, zgodnie z https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Array/map map tworzy kopię tablicy. W twoim przypadku nawet nie używasz tej kopii, więc lepiej będzie, gdy sarna będzie taka jak: arr.forEach (function (a) {if (a in hist) hist [a] ++; else hist [a] = 1;}), ponieważ forEach nie utworzy nowej kopii – pretobomba

+1

Jeśli używasz Undescore, zamiast 'arr.reduce' możesz także spróbować _.countBy (list, iterator) http://underscorejs.org/#countBy – Ande

3

Można pętli każdego indeksu i zapisać go w słowniku i zwiększamy je, gdy każdy że klucz znajduje się .

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

wyjściowe będą:

Boat: 1 
Car: 2 
Truck: 2