情况:我有一段像
这样的代码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}
我需要从该对象中提取的是键,但我需要按顺序浏览 因为我使用它们来绘制线图。我需要按顺序浏览它们,或者我需要重做我的代码,以便它们处于已经有序的数据结构中。
在优雅,效率,可读性等方面,解决这个问题的正确方法是什么?
答案 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);