15

我有一个这样的数组:

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

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

4

2 回答 2

22

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

不,你的方法很好。

更直接的方法呢?

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

var categories = _.chain(items)
  .countBy("category")
  .pairs()
  .sortBy(1).reverse()
  .pluck(0)
  .value();
于 2013-10-02T17:00:58.307 回答
1

我觉得这很不错。你可以把它塞进一个一步减少中,但这最终会比你现在的代码看起来更复杂。如果你打算重用这一堆,你可以使用 compose 和 partial 来减少你正在编写的代码总量。此外,请查看 lodash 作为下划线的替代品 - 它有更多的汁液。

于 2013-10-02T16:29:35.237 回答