Javascript在数组中循环时按索引推入数组
我需要数组中从当前最小日期到当前最大日期的所有日期(每天)。如果日期不存在,我需要添加计数为0的新对象 数组已按日期排序 在我的示例中,数组应转换为:Javascript在数组中循环时按索引推入数组,javascript,arrays,Javascript,Arrays,我需要数组中从当前最小日期到当前最大日期的所有日期(每天)。如果日期不存在,我需要添加计数为0的新对象 数组已按日期排序 在我的示例中,数组应转换为: var arr = [{ date : "2016/1/26", count: 6 }, { date : "2016/1/
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和为此,例如,您可以使用
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(min document.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});
}
}