我有一个javascript,它读取JSON对象并绘制图形。在我的JSON中,我有一系列有序的日期,但是我错过了一些中间日期,它们在构建时没有任何元素。类似的东西:
[
{
"date": "2014-09-22",
"similar": 1,
"trend": 0
},
{
"date": "2014-09-28",
"similar": 1,
"trend": 0
},
{
"date": "2014-09-29",
"similar": 16,
"trend": 1
},
{
"date": "2014-10-11",
"similar": 3,
"trend": 0
},
{
"date": "2014-10-10",
"similar": 2,
"trend": 0
},
{
"date": "2014-10-16",
"similar": 2,
"trend": 0
},
{
"date": "2014-10-15",
"similar": 1,
"trend": 0
},
{
"date": "2014-10-19",
"similar": 3,
"trend": 0
},
{
"date": "2014-10-18",
"similar": 1,
"trend": 0
},
{
"date": "2014-10-22",
"similar": 1,
"trend": 0
}
]
所以,我的想法是在图表上绘制这些信息,添加不存在的日期。为了在图表上绘图,我创建了3个不同的数组,一个具有日期,一个具有相似性,一个具有趋势,以与Chart.js一起使用。所以我创建了以下脚本来创建3个提到的数组:
/*plot timeline on chart*/
var d = new Array;
var t = new Array;
var s = new Array;
$.each (timeline, function(i,item){
idt = new Date(item.date);
idt.setDate(idt.getDate()+1);
month = idt.getMonth()+1;
day = idt.getDate();
if (month<10){month = "0" + month;}
if (day<10){day = "0" + day;}
nextdt = new Date();
d.push(item.date);
t.push(item.trend);
s.push(item.similar);
if (i+1 < timeline.length && item.date != timeline[i+1].date && idt!=nextdt){
nextdt = new Date (timeline[i+1].date);
nextdt.setDate(nextdt.getDate()+1);
month = nextdt.getMonth()+1;
day = nextdt.getDate();
if (month<10){month = "0" + month;}
if (day<10){day = "0" + day;}
idt.setDate(idt.getDate()+1);
while(nextdt > idt){
month = (idt.getMonth())+1;
day = idt.getDate();
if (month<10){month = "0" + month;}
if (day<10){day = "0" + day;}
d.push(idt.getFullYear()+'-'+ month +'-'+ day);
t.push(0);
s.push(0);
idt.setDate(idt.getDate()+1);
}
}
});
问题在于我有一些重复的日期,在某些方面它是在我进入的那天之前的第二天写的。我试图解决这个问题好几天仍然没有成功,尝试过很多东西和很多选择,但都没有。 :( 日期使用的格式为dd-mm-YYYY,如果您看一下10-10-2014,就可以看到问题。
上述JSON的三个输出是:
d s t
22/09/2014 1 0
23/09/2014 0 0
24/09/2014 0 0
25/09/2014 0 0
26/09/2014 0 0
27/09/2014 0 0
28/09/2014 1 0
29/09/2014 16 1
30/09/2014 0 0
01/10/2014 0 0
02/10/2014 0 0
03/10/2014 0 0
04/10/2014 0 0
05/10/2014 0 0
06/10/2014 0 0
07/10/2014 0 0
08/10/2014 0 0
09/10/2014 0 0
10/10/2014 0 0
11/10/2014 3 0
10/10/2014 2 0
11/10/2014 0 0
12/10/2014 0 0
13/10/2014 0 0
14/10/2014 0 0
15/10/2014 0 0
16/10/2014 2 0
15/10/2014 1 0
16/10/2014 0 0
17/10/2014 0 0
18/10/2014 0 0
19/10/2014 3 0
18/10/2014 1 0
19/10/2014 0 0
20/10/2014 0 0
21/10/2014 0 0
22/10/2014 0 0
22/10/2014 1 0
非常感谢!
答案 0 :(得分:1)
我看到你的时间轴没有按升序排列,你假设它在你的代码中。
你有
{
"date": "2014-10-11",
"similar": 3,
"trend": 0
}
前
{
"date": "2014-10-10",
"similar": 2,
"trend": 0
},
尝试坚持迭代timeline
并生成缺少日期的想法,我已经重构了一些像这样的代码。当然,它仅在timeline
按日期升序排列时才有效。
var d = [];
var t = [];
var s = [];
if (timeline.length > 0) {
// Assuming dates are 'yyyy-mm-dd'. Sort by date in ascending order.
timeline.sort(function (s1, s2) {
return s2.date < s1.date;
});
// Adds a new point in the three arrays.
var addSerie = function (date, trend, similar) {
// NOTE: Maybe the way I'm using to get the dd/mm/yyyy is a little bit obscure,
// you can use your way here if you see it more clear.
d.push(date.toISOString().slice(0, 10).split('-').reverse().join('/'));
t.push(trend);
s.push(similar);
}
// Insert the first serie
addSerie(new Date(timeline[0].date), timeline[0].trend, timeline[0].similar);
// Then the rest
for (var i = 1; i < timeline.length; i++) {
var d1 = new Date(timeline[i - 1].date);
d1.setDate(d1.getDate() + 1);
var d2 = new Date(timeline[i].date);
// Generate the empty gap dates starting on the next date
while (d1 < d2) {
addSerie(d1, 0, 0);
d1 = new Date(d1);
d1.setDate(d1.getDate() + 1);
}
addSerie(d2, timeline[i].trend, timeline[i].similar);
}
}