Javascript通过索引推入数组,同时循环遍历它

时间:2016-03-19 16:39:36

标签: javascript arrays

var arr = [{
                        date : "2016/1/26",
                        count: 6
                    },
                    {
                        date : "2016/1/31",
                        count: 2
                    },
                    {
                        date : "2016/2/2",
                        count: 4
                    }]

我需要将数组中的所有日期(每天)从当前最小日期到当前最大日期。如果这一天不存在,我需要添加一个count = 0的新对象。

数组已按日期排序。

在我的示例中,数组应转换为:

arr = [{
        date : "2016/1/26",
        count: 6
    },
               {
        date : "2016/1/27",
        count: 0
    },
    {
        date : "2016/1/28",
        count: 0
    },
    {
        date : "2016/1/29",
        count: 0
    },
    {
        date : "2016/1/30",
        count: 0
    },
    {
        date : "2016/1/31",
        count: 2
    },
    {
        date : "2016/2/1",
        count: 0
    },
    {
        date : "2016/2/2",
        count: 4
    }]

我的方法:

    for (i = 0; i < arr.length-1; i++) { 

                    var prev = new Date(arr[i].date);
                    var next = new Date(arr[i+1].date);

                    if (prev.setTime(prev.getTime() + 86400000) != next) {
                        //86400000 equals a day in miliseconds

                        arr.splice(i+1, 0, {date: prev, count: 0});

                    }

      }

这会产生无限循环?该网站陷入困境..

4 个答案:

答案 0 :(得分:1)

问题出在上一个日期+ 1天和下一个日期之间的比较运算符中:它们总是不同的!尝试在代码中添加一些console.log(),您会看到。由于您只考虑这里的天数,因此您应该从prevnext中提取日期,月份和年份并进行比较。

为此,您可以使用toDateString功能,或者不是在prev变量中添加1天,而是计算prevnext之间的差异并查看它是否超过一天。

答案 1 :(得分:1)

循环中有循环的解决方案。

var arr = [{ date: "2016/1/26", count: 6 }, { date: "2016/1/31", count: 2 }, { date: "2016/2/2", count: 4 }],
    result = function (array) {
        var r = [],
            min = new Date(arr[0].date);

        array.forEach(function (a) {
            var aDate= new Date(a.date);
            while (min < aDate) {
                r.push({ date: min.getFullYear() + '/' + (min.getMonth() + 1) + '/' + min.getDate(), count: 0 });
                min.setTime(min.getTime() + 86400000);
            }
            r.push(a);
            min.setTime(aDate.getTime() + 86400000);
        });
        return r;
    }(arr);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

另一个使用对象计数和两个循环的尝试。我的工作原理是未分类数据。

var arr = [{ date: "2016/1/26", count: 6 }, { date: "2016/1/31", count: 2 }, { date: "2016/2/2", count: 4 }],
    result = function (array) {
        var r = [],
            min = new Date(arr[0].date),
            max = new Date(arr[0].date),
            object = {},
            d;

        array.forEach(function (a) {
            var x = new Date(a.date);
            if (!object[a.date]) {
                object[a.date] = { date: a.date, count: 0 };
                if (x < min) {
                    min = x;
                }
                if (x > max) {
                    max = x;
                }
            }
            object[a.date].count += a.count;
        });
        while (min <= max) {
            d = min.getFullYear() + '/' + (min.getMonth() + 1) + '/' + min.getDate();
            r.push(object[d] || { date: d, count: 0 });
            min.setTime(min.getTime() + 86400000);
        }
        return r;
    }(arr);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

答案 2 :(得分:0)

Date是Javascript中的一个对象,当你用它们比较它们时,它会比较对象的引用。使用date.getTime()或+(date)来获取可以比较的值。

答案 3 :(得分:0)

您的if条件始终为true,因为您正在比较两个不同的日期对象。即使它们可能代表相同的日期,因为它们是不同的对象,但它们被认为是不相等的。

以下是一些代码,用于执行您正在寻找的日期间隙填充:

&#13;
&#13;
// date formatter
function dateFmt(dt) {
    return dt.getFullYear() + '/' + (dt.getMonth()+1) + '/' + dt.getDay();
}

// main function
function fillDateGaps(arr) {
    if (!arr.length) return; // detect invalid input
    var result = [];
    var i = 0;
    var arrDate = new Date(arr[0].date);
    var curDate = arrDate;
    while (true) {
        var obj = { date: dateFmt(curDate), count: 0 };
        result.push(obj);
        if (arrDate.getDate() === curDate.getDate()) {
            console.log(arrDate, i);
            obj.count = arr[i].count;
            i++;
            if (i >= arr.length) break; // all done
            arrDate = new Date(arr[i].date);
        }
        curDate.setDate(curDate.getDate()+1);
        console.log('cur', curDate);
    }
    return result;
}

// example data
var arr = [{
    date : "2016/1/26",
    count: 6
},
{
    date : "2016/1/31",
    count: 2
},
{
    date : "2016/2/2",
    count: 4
}];

// call function
var result = fillDateGaps(arr);

// Snippet: output result in readable format
document.write ('<pre>' + JSON.stringify(result, null, 4) + '</pre>');
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;