按发生次数计数和排序

End*_*ono 15 underscore.js

我有这样一个数组:

var items = [
  {name: 'popcorn', category: 'snacks'},
  {name: 'nachos', category: 'snacks'},
  ...
  {name: 'coke', category: 'drinks'}
];
Run Code Online (Sandbox Code Playgroud)

我想得到一个按照项目数量排序的类别列表(大多数项目排在第一位):

['snacks', 'drinks']
Run Code Online (Sandbox Code Playgroud)

我是这样做的:

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

所以结果countBy是一个对象,我必须使用pairs它将它转换为一个数组数组,以便对它进行排序.

我想知道是否有更简单的方法来做到这一点?内置功能?

Ber*_*rgi 22

我想知道是否有内置功能?

不,你的方法很好.

更简单的方法吗?

您可以通过仅传递属性名称而不是函数来缩短它:

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