这是我所拥有的示例:
[{
"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"
}]
我找到了this thread ,但我不知道如何将其应用到我的数据中。有什么帮助吗?
编辑2:This is what I tried so far ,但我在第 7 行和第 23 行收到 Uncaught TypeError: Cannot read property 'length' of undefined
。
最佳答案
我们从获取第一个和最后一个日期开始。让
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
新的日期code> 等于 null,并且 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
。
关于javascript - 使用 jquery/javascript 填充 json 字符串中缺失的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43651385/