Javascript添加系列中不存在的日期

时间:2014-10-29 10:23:02

标签: javascript json date

我有一个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

非常感谢!

1 个答案:

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