Количество и сортировка по количеству вхождений

У меня есть такой массив:

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 для преобразования его в массив массивов, чтобы отсортировать его.

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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