Количество и сортировка по количеству вхождений
У меня есть такой массив:
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 как альтернативу подчеркиванию - он получил больше сока.