Javascript在数组中循环时按索引推入数组

Javascript在数组中循环时按索引推入数组,javascript,arrays,Javascript,Arrays,我需要数组中从当前最小日期到当前最大日期的所有日期(每天)。如果日期不存在,我需要添加计数为0的新对象 数组已按日期排序 在我的示例中,数组应转换为: var arr = [{ date : "2016/1/26", count: 6 }, { date : "2016/1/

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

数组已按日期排序

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

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

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
    }]
(i=0;i var prev=新日期(arr[i].日期); var next=新日期(arr[i+1].日期); if(上一次设置时间(上一次获取时间()+86400000)!=next){ //86400000相当于一天,单位为毫秒 arr.splice(i+1,0,{日期:prev,计数:0}); } }
这是一个无限循环?网站被卡住了。

问题在于上一个日期+1天和下一个日期之间的比较运算符:它们总是不同的!尝试在代码中添加一些
console.log()
,您将看到。当你只考虑这里的日子时,你应该从<代码> Prave和 Nex/Cuth>天、月、年中进行比较。p>
为此,例如,您可以使用
toDateString
函数,或者计算
prev
next
之间的差值,而不是在
prev
变量中添加1天,并查看其是否大于1天。

循环中有循环的解决方案

var arr=[{日期:“2016/1/26”,计数:6},{日期:“2016/1/31”,计数:2},{日期:“2016/2/2”,计数:4}],
结果=函数(数组){
var r=[],
最小值=新日期(arr[0]。日期);
array.forEach(函数(a){
var aDate=新日期(a.日期);
while(mindocument.write(“”+JSON.stringify(结果,0,4)+“”)Date是Javascript中的一个对象,当您将它们与equal进行比较时,它会将引用与对象进行比较。使用date.getTime()或+(date)获取可以比较的值。

如果
条件始终为真,则您的
,因为您正在比较两个不同的日期对象。尽管它们可能代表相同的日期,但由于它们是不同的对象,因此被认为是不相等的

下面是一些代码,用于填充您要查找的日期间隔:

//日期格式化程序
函数日期fmt(dt){
返回dt.getFullYear()+'/'+(dt.getMonth()+1)+'/'+dt.getDay();
}
//主要功能
函数fillDateGaps(arr){
如果(!arr.length)返回;//检测无效输入
var结果=[];
var i=0;
var arrDate=新日期(arr[0].Date);
var curDate=arrDate;
while(true){
var obj={date:dateFmt(curDate),计数:0};
结果:推送(obj);
如果(arrDate.getDate()==curDate.getDate()){
控制台日志(arrDate,i);
obj.count=arr[i]。计数;
i++;
如果(i>=arr.length)中断;//全部完成
arrDate=新日期(arr[i].Date);
}
curDate.setDate(curDate.getDate()+1);
console.log('cur',curDate);
}
返回结果;
}
//示例数据
var arr=[{
日期:“2016/1/26”,
计数:6
},
{
日期:“2016/1/31”,
计数:2
},
{
日期:“2016年2月2日”,
计数:4
}];
//调用函数
var结果=填充日期间隔(arr);
//代码段:以可读格式输出结果
document.write(''+JSON.stringify(result,null,4)+'')

你是对的。但如果我这样做,我只会为两天之间的间隔增加一天。在我的示例中,我只添加2016/1/27和2016/2/1,因为新对象没有在循环中处理。哈,好吧,我只是觉得你无限循环的原因很明显,只看了一眼你的代码。考虑到这一点,我将进行编辑。编辑完成后,问题根本不是我所想的。
    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});

                    }

      }