首页 > 解决方案 > 如何在javascript中的给定数据范围内每天每小时过滤一个数据对象

问题描述

这是 json 对象的片段,我试图从 1/1 到 3/31 每小时获取一个 json 对象。假设有一些 JSON 对象有时间 01/01/2020 12:00 ,01/01/2020 13:00 等等。我只想每天获取这些 json 对象。所以每天应该有 24 个 json 对象。我知道如何根据一个静态条件过滤元素数组,但我不知道当条件是动态时如何做。

[
  {
    "id": 2617820,
    "time": "01/01/2020 12:16",
    "stationId": "150000",
    "RoadStatus": "Ice",
    "surfaceRoadTemperature": "30.9F",

  },
  {
    "id": 2617819,
    "time": "01/01/2020 12:26",
    "stationId": "150000",
    "RoadStatus": "Ice",
    "surfaceRoadTemperature": "30.7F",
  },
  {
    "id": 2617818,
    "time": "01/01/2020 12:30",
    "stationId": "150000",
    "RoadStatus": "Ice",
    "surfaceRoadTemperature": "30.9F",

  },
  {
    "id": 2617817,
    "time": "01/01/2020 12:36",
    "stationId": "150000",
    "RoadStatus": "Ice",
    "surfaceRoadTemperature": "30.7F",

  }
]

标签: javascriptarraysjsonfilter

解决方案


你提到了 Array.filter() 所以我假设你可能想要一个函数式的答案。您是否尝试过 Array.reduce()。

arr.reduce(callback( accumulator, currentValue[, index[, array]] )[, initialValue])- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

在您的情况下,回调类似于

function addHourif(acc, cv){
const prevtime = new Date(acc.slice(-1)[0].time).getTime()
const cvtime = new Date(cv.time).getTime()

if (cvtime >= prevtime + 60*60*1000 ) return [...acc , cv]
else return acc
}

console.log(a.reduce(addHourif, [a[0]]))

如果我更改了时间,这对您的数据有效,这只是检查自上次输入以来是否已经过去了一个小时,您可以使用 Date 方法来优化该过程,以便您获得最接近一个小时或每天 24 个等。 ..


推荐阅读