2013-09-29 6 views
15

У меня есть массив как это:Count и сортировать по числу вхождений

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

Я хочу, чтобы получить список категорий упорядоченных по количеству элементов на ней (большинство пунктов первой):

['snacks', 'drinks'] 

Вот как я это сделал:

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

Таким образом, результат countBy является объектом, и я должен использовать pairs, чтобы преобразовать его в массив массивов, чтобы отсортировать его.

Интересно, есть ли более простой способ сделать это? Встроенная функция?

+0

Вы можете просто пройти «категорию» в функции countBy. Делает его маленьким, более слабым, более выразительным. –

+0

Не будет ли возвращенная ценность этого вида [['snacks', 10] ['drinks', 9]]? – JSager

+0

@ JSager oops Я забыл шаг карты. Исправлена. –

ответ

22

Интересно, есть ли встроенная функция?

Нет, ваш подход в порядке.

более простой способ сделать это?

Вы можете сократить его немного, передавая только имена свойств, а не функции:

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

Вы можете сохранить один шаг, отсортировав по убыванию, а не сортируя по возрастанию, а затем реверсивный (также имеет преимущество в сохранении порядка элементов с тем же самым отсчетом) 'var categories = _.chain (items). countBy ("category"). pairs(). sortBy (function (pair) {return -pair [1];}). pluck (0) .value(); ' (Извините за однострочный форматировать кодовый блок) –

+0

Да, конечно, вы можете (и OP уже это сделал), но я не хотел использовать функции обратного вызова (для сокращения кода). – Bergi

1

Я думаю, что это очень хорошо. Вы могли бы втиснуть его в одношаговое сокращение, но это закончилось бы сложнее, чем теперь выглядит ваш код. Если вы собираетесь повторно использовать эту связку, вы можете использовать составление и частичное, чтобы уменьшить общий объем кода, который вы пишете. Кроме того, проверьте lodash как альтернативу подчеркиванию - у него больше сока.

Смежные вопросы