对 _.countBy 的结果进行排序

Sorting the results of _.countBy

我有一个系列(产品),我这样使用 _.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() 可以吗?

无法保证 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>