2013-09-29 74 views
15

Tôi có một mảng như thế này:Count và sắp xếp theo số lần xuất hiện

var items = [ 
    {name: 'popcorn', category: 'snacks'}, 
    {name: 'nachos', category: 'snacks'}, 
    ... 
    {name: 'coke', category: 'drinks'} 
]; 

Tôi muốn có được một danh sách các loại theo yêu cầu của số lượng các mục trên đó (hầu hết các mặt hàng đầu tiên):

['snacks', 'drinks'] 

Sau đây là cách tôi đã làm nó:

var categories = _.chain(items) 
    .countBy(function (i) { return i.category }) 
    .pairs() 
    .sortBy(function (c) { return -c[1] }) 
    .map(function (c) { return c[0] }) 
    .value(); 

Vì vậy, kết quả của countBy là một đối tượng, và tôi phải sử dụng pairs để chuyển đổi nó thành một mảng các mảng để sắp xếp nó.

Tôi tự hỏi có cách nào đơn giản hơn để làm điều đó không? Tích hợp chức năng?

+0

Bạn chỉ có thể vượt qua 'category' vào chức năng countBy. Làm cho nó một chút teeny weeny chút biểu cảm hơn. –

+0

Sẽ không có giá trị trả về trông giống như [['đồ ăn nhẹ', 10] ['đồ uống', 9]]? – JSager

+0

@ JSager oops Tôi quên bước bản đồ. Đã sửa. –

Trả lời

22

Tôi tự hỏi nếu có chức năng tích hợp?

Không, cách tiếp cận của bạn vẫn ổn.

cách đơn giản hơn để làm điều đó?

Bạn có thể rút ngắn nó một chút bằng cách chỉ tên thuộc tính, không phải chức năng:

var categories = _.chain(items) 
    .countBy("category") 
    .pairs() 
    .sortBy(1).reverse() 
    .pluck(0) 
    .value(); 
+0

Bạn có thể lưu một bước bằng cách sắp xếp theo thứ tự giảm dần ngay lập tức thay vì sắp xếp tăng dần và sau đó đảo ngược (Cũng có lợi thế giữ thứ tự các mục có cùng số lượng còn nguyên) 'var categories = _.chain (items). countBy ("danh mục"). cặp(). sortBy (hàm (cặp) {return-pair [1];}). pluck (0) .value(); ' (Xin lỗi về một lớp lót - đang gặp khó khăn định dạng một khối mã) –

+0

Vâng, tất nhiên bạn có thể (và OP đã làm điều này), nhưng quan điểm của tôi là không sử dụng bất kỳ chức năng gọi lại (chỉ rút ngắn mã). – Bergi

1

Tôi nghĩ điều này khá tốt. Bạn có thể nhồi nhét nó thành một bước giảm nhưng điều đó sẽ trở nên phức tạp hơn so với mã của bạn bây giờ. Nếu bạn định sử dụng lại nhóm này, bạn có thể sử dụng soạn thảo và một phần để giảm tổng số mã bạn đang viết. Ngoài ra, hãy kiểm tra lodash như là một thay thế cho gạch dưới - nó có nhiều nước hơn.

Các vấn đề liên quan