按发生次数计数和排序

时间:2013-09-29 02:37:30

标签: underscore.js

我有一个这样的数组:

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将其转换为数组数组才能对其进行排序。

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

2 个答案:

答案 0 :(得分:22)

  

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

不,你的方法很好。

  

更直接的方式吗?

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

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

答案 1 :(得分:1)

我认为这很不错。你可以把它塞进一步减少,但这会比你现在的代码看起来更复杂。如果你要重复使用它,你可以使用compose和partial来减少你正在编写的代码总量。另外,请查看lodash作为下划线的替代方案 - 它有更多的果汁。