2013-09-29 25 views
15

Mam tablicę takiego:Hrabia i sortować według liczby wystąpień

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

chcę uzyskać listę kategorii zamówionych przez liczbę przedmiotów na nim (najwięcej rzeczy pierwszy):

['snacks', 'drinks'] 

Oto jak to zrobiłem:

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

więc wynikiem countBy to obiekt, a muszę używać pairs, aby przekształcić go w tablicę tablic w celu posortowania.

Zastanawiam się, czy istnieje prostszy sposób na zrobienie tego? Wbudowana funkcja?

+0

mogłyby po prostu przekazać „kategoria” w funkcji countBy. Sprawia, że ​​to maleństwo jest nieco bardziej wyraziste. –

+0

Czy zwrócona wartość nie wyglądałaby [["przekąski", 10] ["napoje", 9]]? – JSager

+0

@JSager oops Zapomniałem kroku mapy. Naprawiony. –

Odpowiedz

22

Zastanawiam się, czy istnieje wbudowana funkcja?

Nie, twoje podejście jest w porządku.

bardziej prosty sposób to zrobić?

Można go skrócić nieco przepuszczając tylko nazwy własności, a nie funkcje:

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

Możesz zapisać jeden krok, sortując w porządku malejącym, zamiast sortować rosnąco, a następnie cofając (ma również tę zaletę, że utrzymuje kolejność pozycji z takim samym numerem nienaruszonym). 'var categories = _.chain (items). countBy ("category") pairs(). sortBy (function (pair) {return-pair [1];}). pluck (0) .value(); ' (Przepraszam za jeden-liniowiec - walczę z sformatuj blok kodu) –

+0

Tak, oczywiście możesz (i OP już to zrobił), ale moim celem nie było użycie żadnych funkcji zwrotnych (tylko skrócenie kodu). – Bergi

1

Myślę, że to całkiem nieźle. Możesz go zmniejszyć o jeden krok, ale skończyłoby się to bardziej skomplikowanie niż wygląda teraz twój kod. Jeśli zamierzasz ponownie wykorzystać tę garść, możesz użyć funkcji tworzenia i częściowego zmniejszania całkowitej ilości kodu, który piszesz. Sprawdź też lodash jako alternatywę dla podkreślenia - ma więcej soku.

Powiązane problemy