我有一个这样的数组:
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
将其转换为数组数组才能对其进行排序。
我想知道是否有更简单的方法来做到这一点?内置功能?
答案 0 :(得分:22)
我想知道是否有内置功能?
不,你的方法很好。
更直接的方式吗?
您可以通过仅传递属性名称而不是函数来缩短它:
var categories = _.chain(items)
.countBy("category")
.pairs()
.sortBy(1).reverse()
.pluck(0)
.value();
答案 1 :(得分:1)
我认为这很不错。你可以把它塞进一步减少,但这会比你现在的代码看起来更复杂。如果你要重复使用它,你可以使用compose和partial来减少你正在编写的代码总量。另外,请查看lodash作为下划线的替代方案 - 它有更多的果汁。