对_.countBy的结果进行排序

时间:2015-03-11 16:24:24

标签: sorting collections underscore.js

我有一个集合(产品),我使用_.countBy这样:

var totalByBrand = _.countBy(result, "Brand");

我有这个结果:

{
    'Brand 1 ' : 5,
    'Brand 2 ' : 45,
    'Brand 3 ' : 2,
    ...
    'Brand 99 ' : 25
}

我尝试对此结果进行排序以获得:

{
    'Brand 3 ' : 2,
    'Brand 1 ' : 5,
    'Brand 99 ' : 25,
    ...
    'Brand 2 ' : 45
}

是否可以使用_.sortBy()

1 个答案:

答案 0 :(得分:3)

在JavaScript Does JavaScript Guarantee Object Property Order?中无法保证属性顺序,这意味着您无法对它们进行排序。

您必须使用不同的结构,可能是{brand: ..., count: ...}之类的对象列表,并在count上排序。例如

var totalByBrand = _.countBy(products, 'Brand');

var sorted = _.chain(totalByBrand).
    map(function(cnt, brand) {
        return {
            brand: brand,
            count: cnt
        }
    })
    .sortBy('count')
    .value();

和演示

var products = [
    {Brand: "Brand 1", id: 1},
    {Brand: "Brand 1", id: 2},
    {Brand: "Brand 2", id: 3},
    {Brand: "Brand 3", id: 4},
    {Brand: "Brand 3", id: 5},
    {Brand: "Brand 1", id: 6},
];

var totalByBrand = _.countBy(products, 'Brand');
    
var sorted = _.chain(totalByBrand).
    map(function(cnt, brand) {
        return {
            brand: brand,
            count: cnt
        }
    }).sortBy('count')
    .value();
    
console.dir(
    sorted
);
    
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.0/underscore-min.js"></script>