使用 jquery/javascript 填充 json 字符串中缺失的日期
这是我所拥有的一个示例:
[{
"probeTemp": "35.40",
"dateProbe": "2015-08-1"
}, {
"probeTemp": "34.89",
"dateProbe": "2015-08-3"
}, {
"probeTemp": "34.42",
"dateProbe": "2015-08-5"
}]
如何在 json 字符串中填充最小日期和最大日期之间的缺失日期,以便缺失的字段最终像这样?
[{
"probeTemp": "35.40",
"dateProbe": "2015-08-1"
}, {
"probeTemp": null,
"dateProbe": "2015-08-2"
}, {
"probeTemp": "34.89",
"dateProbe": "2015-08-3"
}, {
"probeTemp": null,
"dateProbe": "2015-08-4"
}, {
"probeTemp": "34.42",
"dateProbe": "2015-08-5"
}]
我找到了 这个线程 ,但我不知道如何将其应用于我的数据。有什么帮助吗?
编辑 2:
这是我到目前为止尝试过的
,但我在第 7 行和第 23 行收到
Uncaught TypeError:无法读取未定义的属性“长度”
。
我们从获取第一个和最后一个日期开始。设
const a = [{
"probeTemp": "35.40",
"dateProbe": "2015-08-1"
}, {
"probeTemp": "34.89",
"dateProbe": "2015-08-3"
}, {
"probeTemp": "34.42",
"dateProbe": "2015-08-5"
}];
然后
const firstDate = a[0].dateProble; // "2015-08-1"
const lastDate = a[a.length-1].dateProbe; // "2015-08-5"
现在我们可以构建所有日期的范围。
const dates = [ ...Array(
Date.parse(lastDate)/86400000 - Date.parse(firstDate)/86400000 + 1).keys()
].map(k => new Date(
86400000*k+Date.parse(firstDate)
).toISOString().slice(0, 10).replace(/-0(\d)$/, '-$1'));
// [ "2015-08-1", "2015-08-2", "2015-08-3", "2015-08-4", "2015-08-5" ]
我们创建了具有适当长度的范围,然后将其在时间轴上按毫秒数从纪元移动到第一个日期。最后,我们再次创建日期并将其转换为字符串,进行切片以获得更自然的日期格式,并使用正则表达式从天数中删除前导
0
。
在最后一步中,我们可以定义
res
- 包含结果的变量。我们将其定义为空数组,并在 for 循环中推送下一个元素。最重要的是
probeTemp
。如果我们从范围中考虑的日期等于数组中的日期,那么我们可以添加
probeTemp
,然后增加
j
索引,如果是新日期,则
probeTemp
等于空,并且
j
索引不变。
let res = [];
for(let i=0,j=0; i<dates.length; i++) {
res[i] = {
dateProbe: dates[i],
probeTemp: dates[i] === a[j].dateProbe ? a[j++].probeTemp : null
};
};
console.table(res);
此解决方案适用于已排序数组
a
。
嘿,我会做类似的事情。
- 获取第一个日期并解析 ist Date.parse()
- 走到下一个日期,检查第一个日期 + 1 (new Date()getDate() + 1) 是否是同一个日期,如果是则继续下一步,如果不是则创建这个日期并插入它。
- 等等
使用 此处 的 api 实例化日期,该 api 足够智能 - 在迭代中一次前进一天时 - 考虑短月份、闰年等。通过将 getDate() 返回的任何内容(在 Date 实例上)加 1 来前进,然后使用该后续值调用 setDate 方法。或者使用 getTime 和 setTime 方法添加一天中的毫秒数。
根据您之前存在的探测器温度图检查每个日期
您可以让另一个最大日期实例等待比较。进行比较时,对两个实例都使用 getTime 方法,即:
if ( iterDate.getTime() !== maxDate.getTime() ) {
if ( !previousProbeTemp )
newProbeTemp = null;