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

时间:2017-04-27 07:34:53

标签: javascript jquery 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"
    }]

我找到了this thread,但我不知道如何将其应用到我的数据中。有什么帮助吗?

编辑2:This is what I tried so far,但我在第7和第23行得到Uncaught TypeError: Cannot read property 'length' of undefined

3 个答案:

答案 0 :(得分:0)

嘿,我会这样想。

  1. 获取第一个Date并解析ist Date.parse()
  2. 走到下一个日期,检查第一个日期+ 1(新日期()getDate()+ 1)是否是相同的日期,如果是这样,如果没有创建此日期并插入它,请走下一步。
  3. 等等

答案 1 :(得分:0)

使用智能足够聪明的api here实例化日期 - 在迭代中一次提前一天 - 帐户短期,闰年等等。通过向getDate添加1来提前( )返回(在Date实例上),然后使用该更高的值调用setDate方法。或者使用getTime和setTime方法添加一天中的毫秒数。

根据先前存在的探针温度图检查每个日期

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

if ( iterDate.getTime() !== maxDate.getTime() ) {
    if ( !previousProbeTemp )
        newProbeTemp = null;

答案 2 :(得分:0)

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

fetch('https://pokeapi.co/api/v2/pokemon/')
  .then(response => response.json())
  .then(pokemon => this.setState({ pokemon: pokemon }))
  .catch(err => console.log(err));

然后

fetch('https://pokeapi.co/api/v2/pokemon/')
  .then(response => response.json())
  .then(({results}) => this.setState({ pokemon: results }))
  .catch(err => console.log(err));

现在我们可以建立所有日期的范围。

const a = [{
  "probeTemp": "35.40",
  "dateProbe": "2015-08-1"
}, {
  "probeTemp": "34.89",
  "dateProbe": "2015-08-3"
}, {
  "probeTemp": "34.42",
  "dateProbe": "2015-08-5"
}]; 

我们创建了具有适当长度的范围,然后将其在时间轴上从纪元到日期的第一毫秒之间移动了几毫秒。最后我们创建了Dates再次转换 字符串,将其切成薄片以获得更自然的日期格式,并使用regexp从天数中删除前导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,然后递增probeTemp索引,如果它是新日期,则probeTemp等于null和{{1 }}索引不变。

j

此解决方案适用于排序数组probeTemp