开发者问题收集

使用 jquery/javascript 填充 json 字符串中缺失的日期

2017-04-27
2103

这是我所拥有的一个示例:

[{
  "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:无法读取未定义的属性“长度”

3个回答

我们从获取第一个和最后一个日期开始。设

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

Daniel
2018-09-14

嘿,我会做类似的事情。

  1. 获取第一个日期并解析 ist Date.parse()
  2. 走到下一个日期,检查第一个日期 + 1 (new Date()getDate() + 1) 是否是同一个日期,如果是则继续下一步,如果不是则创建这个日期并插入它。
  3. 等等
enno.void
2017-04-27

使用 此处 的 api 实例化日期,该 api 足够智能 - 在迭代中一次前进一天时 - 考虑短月份、闰年等。通过将 getDate() 返回的任何内容(在 Date 实例上)加 1 来前进,然后使用该后续值调用 setDate 方法。或者使用 getTime 和 setTime 方法添加一天中的毫秒数。

根据您之前存在的探测器温度图检查每个日期

您可以让另一个最大日期实例等待比较。进行比较时,对两个实例都使用 getTime 方法,即:

if ( iterDate.getTime() !== maxDate.getTime() ) {
    if ( !previousProbeTemp )
        newProbeTemp = null;
Montagist
2017-04-27