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});
}
}
这会产生无限循环?该网站陷入困境..
答案 0 :(得分:1)
问题出在上一个日期+ 1天和下一个日期之间的比较运算符中:它们总是不同的!尝试在代码中添加一些console.log()
,您会看到。由于您只考虑这里的天数,因此您应该从prev
和next
中提取日期,月份和年份并进行比较。
为此,您可以使用toDateString
功能,或者不是在prev
变量中添加1天,而是计算prev
和next
之间的差异并查看它是否超过一天。
答案 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,因为您正在比较两个不同的日期对象。即使它们可能代表相同的日期,因为它们是不同的对象,但它们被认为是不相等的。
以下是一些代码,用于执行您正在寻找的日期间隙填充:
// 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;