2012-10-13 26 views
28

thể trùng lặp:
array_count_values for javascript insteadJavascript Nhóm By Mảng

Hãy nói rằng tôi có mảng JavaScript đơn giản như sau:

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

Tôi muốn nhóm và đếm vì vậy tôi mong đợi một bản đồ khóa/giá trị của:

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

Bạn đã thử một cái gì đó không hoạt động? – haynar

+3

Tôi không nghĩ rằng đây là bản sao. Câu hỏi này còn xa hơn so với câu hỏi của Php. –

+1

Tôi không nghĩ rằng đây cũng là một bản sao. Tôi đang tìm kiếm một câu hỏi và câu trả lời về Javascript, tôi sẽ không hiểu câu hỏi khác mà chỉ liệt kê mã PHP. – Ande

Trả lời

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

kết quả trong

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

này hoạt động, quá:

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

giải pháp đầu tiên không hoạt động cho các giá trị không tương thích với các tên biến như GUID hoặc số nguyên, mặc dù nó là tuyệt vời –

+7

Chỉ cần lưu ý, theo https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Array/map map tạo một bản sao của mảng. Trong trường hợp của bạn, bạn thậm chí không sử dụng bản sao đó, do đó, tốt hơn là nên làm như vậy: arr.forEach (hàm (a) {if (a (hist) hist [a] ++; else hist [a] = 1;}) bởi vì forEach sẽ không tạo một bản sao mới – pretobomba

+1

Nếu bạn đang sử dụng Undescore, thay vì 'arr.reduce' bạn cũng có thể thử _.countBy (danh sách, trình lặp) http://underscorejs.org/#countBy – Ande

3

Bạn có thể lặp qua mỗi chỉ mục và lưu nó trong một cuốn từ điển và tăng nó khi mỗi khóa được tìm thấy .

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

Output sẽ là:

Boat: 1 
Car: 2 
Truck: 2