2015-05-20 75 views
0

我想排序,然后切片一组JavaScript对象。我已成功切分数据,但排序返回的是既不按类别也不按字母顺序排序的类别列表。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:

的第4个对象屏幕抓取在top10

Console output for top10

+0

确保'data'包含你认为它包含(以'console.dir (数据);'例如)。你也可以通过切换'a'和'b'去除'.reverse()'。 – sebnukem

+0

'数据'是好的,并正确地滚动,其只是排序不工作,就好像它没有在'b.value - a.value;'注册'值' - 感谢'reverse'的帮助。 – woodbine

+0

您可能想要将'value'解析为一个数字(例如,在其前面放置一个“+”)。 –

回答

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); 
});