Javascript对象排序和切片

时间:2015-05-20 20:23:15

标签: javascript arrays d3.js

我尝试排序然后切片一组javascript对象。我已成功切片数据,但排序返回的类别列表既不按字母顺序按类别也不按值按字母顺序排序。

我的CSV看起来像这样:

category,date_calc,value,YYYY,MM
string1,2011-08-01,46440.16,2011,8
string2,2013-03-01,68249.72,2013,3
string1,2014-01-01,4285,2014,1
string3,2012-03-01,47646.82,2012,3
...

这是我的代码:

d3.csv("data/ncc_category.csv", function(error, csv) {   
    var data = d3.nest()
    .key(function(d) { return d.category;})
    .rollup(function(d) { return d3.sum(d, function(g) {return g.value; }); }).entries(csv) 

    var sorted = data.sort(function (a, b) {
        return a.value - b.value; 
    }).reverse();

    var top10 = sorted.slice(0, 10); // slice
        console.log(top10);
});

编辑: 屏幕抓取data中的前4个对象。

Console output for data:

top10

中前4个对象的屏幕抓取

Console output for top10

1 个答案:

答案 0 :(得分:0)

好的,所以这是列命名的一个有益的教训,命名我的专栏value,我没有意识到当d3构造一个卷起的对象数组时,它给出了主要的列名为key,汇总列名称为values。一旦我更改了原始csv中的列名称,我就可以看到问题了,我还使用了此处建议的排序代码:Sort array of objects by string property value in JavaScript

d3.csv("data/ncc_category.csv", function(error, csv) {   
var data = d3.nest()
.key(function(d) { return d.category;})
.rollup(function(d) { return d3.sum(d, function(g) {return +g.total_spend; }); }).entries(csv)  

var sorted = data.sort(function (a, b) {
    if (a.values < b.values) {
        return 1;
}
    if (a.values > b.values) {
        return -1;
    }
    // a must be equal to b
    return 0;
});
console.dir(sorted);

var top10 = sorted.slice(0, 10); // slice the first 10
    console.dir(top10);
});