2012-10-13 68 views
28

可能重複:
array_count_values for javascript instead的JavaScript集團通過陣列

比方說,我有簡單的JavaScript數組如下所示:

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

我想組的數每一個,所以我會期望一個鍵/值的地圖:

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

你嘗試過的東西,不工作? – haynar

+3

我不認爲這是重複的。這個問題遠比Php的問題通用。 –

+1

我不認爲這是重複的。我正在尋找關於Javascript的問題和回答,我不會理解其他只列出PHP代碼的問題。 – Ande

回答

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

結果

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

這工作,也:

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

第一種解決方案不適用於與變量名稱(如GUID或整數)不兼容的值,雖然它很棒 –

+7

根據https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Array/map map會創建數組的副本。在你的情況下,你甚至沒有使用該副本,所以它會更好地做到這一點:arr.forEach(function(a){if(a in hist)hist [a] ++; else hist [a] = 1;}),因爲forEach不會創建新副本 – pretobomba

+1

如果您使用的是Undescore,而不是'arr.reduce',您還可以嘗試_.countBy(list,iterator)http://underscorejs.org/#countBy – Ande

3

您可以通過各指標環,並將其保存在一本字典,並增加它時,每一個鍵被發現。

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

輸出將是:

Boat: 1 
Car: 2 
Truck: 2