以排序方式检索此信息的最佳方法是什么?

时间:2015-12-30 02:25:11

标签: javascript algorithm

情况:我有一段像

这样的代码
var DealsByMonth = {};
for (var region in this.DealsByRegion) {
    this.DealsByRegion[region].forEach(function (deal) {
        //  deal.Created is in form like "2015-05-04T08:26:38Z"
        var parts = deal.Created.split('-'),
            monthstr = [parseInt(parts[1]), parseInt(parts[0])].join("/");
        if (DealsByMonth[monthstr] !== undefined) {
            ++DealsByMonth[monthstr]
        } else {
            DealsByMonth[monthstr] = 0;
        }
    });
}
console.log(DealsByMonth); // TEST

 var line_data = {
    labels: [],
    datasets: [
        {
            label: "MSfC Deals - Month by Month",
            fillColor: "rgba(220,220,220,0.2)",
            strokeColor: "rgba(220,220,220,1)",
            pointColor: "rgba(220,220,220,1)",
            pointStrokeColor: "#fff",
            pointHighlightFill: "#fff",
            pointHighlightStroke: "rgba(220,220,220,1)",
            data: []
        }
    ]
 }; 

 for ( var key in DealsByMonth ) 
 {
    line_data.labels.push(key);
    line_data.data.push(DealsByMonth[key]);
 }

正在打印的内容是

之类的对象
{1/2015: 6, 2/2015: 14, 3/2015: 15, 4/2015: 24, 5/2015: 33, 6/2015: 16, 7/2015: 14, 8/2015: 22, 9/2015: 29, 10/2014: 41, 11/2014: 9, 11/2015: 14, 12/2014: 1, 12/2015: 32}

我需要从该对象中提取的是键,但我需要按顺序浏览 因为我使用它们来绘制线图。我需要按顺序浏览它们,或者我需要重做我的代码,以便它们处于已经有序的数据结构中。

在优雅,效率,可读性等方面,解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

离开我的头顶,对键进行排序,然后使用排序顺序

Object.keys(DealsByMonth).sort(function(a, b) {
    var sa = a.split('/'); // index 0 = month, 1 = year
    var sb = b.split('/');
    var index = (sa[1] == sb[1]) ? 0 : 1; // if year is same, compare months
    return parseFloat(sa[index]) - parseFloat(sb[index]);
}).forEach(function(key) {
    line_data.labels.push(key);
    line_data.data.push(DealsByMonth[key]);
});

答案 1 :(得分:0)

this answer类似,

int

答案 2 :(得分:0)

如果您希望在对象中正确排序数据,则应该以正确比较的方式(按照您希望的方式)保存密钥。比较两个日期时,首先要比较的是年份,月份和日期。在您的代码中,您保留了一年前的月份,例如:"1/2015",如果您希望它正确排序,则该错误,因为基于此格式"4/2014"位于"1/2015"之后,这是monthstr = [parseInt(parts[1]), parseInt(parts[0])].join("/"); 不是你想要的。

所以我建议你把它保持在前面和后一个月,改变:

monthstr = [parseInt(parts[0]), parseInt(parts[1])].join("/");

为:

$results = preg_split('/(?=_[a-z])/', $str);