按日期过滤JSON数据并从中创建一个新数组

时间:2018-07-13 13:36:33

标签: javascript arrays json for-loop

所以我在使用Javascript和JSON数据时遇到了这个问题。 当我从某个URL获取数据时,我将数据包含在带有字符串的JSON文件中。 现在我的问题是。这些字符串之一是我需要使用的日期,因此当该日期小于当前日期时,它将形成一个新的字符串,这样我就可以正确地将数据显示给我正在设计的HTML。 ?

我的项目的想法是,它显示当天列出的事件,而我只想显示即将发生的事件,而不是已经结束的事件。

注意日期为ISO_8601格式。我也是脚本新手。预先谢谢你。

4 个答案:

答案 0 :(得分:1)

我不知道您的数据看起来如何,但是通常来说,您需要执行两个步骤:

  • 将字符串转换为实际的Date对象
  • 过滤掉过去的日期

转换非常简单,只需new Date(<ISO 8601 string>)

new Date("2018-06-12"); // -> Tue Jun 12 2018 01:00:00 GMT+0100
new Date("2018-07-13"); // -> Fri Jul 13 2018 01:00:00 GMT+0100

使用Array.filter可以过滤掉过去的事件。您为它提供了一个返回TrueFalse的函数,并为每个数组项运行它。函数返回True返回的项目将放入新数组:

[1, 3, 4, 6, 7].filter(number => number > 4); // -> [6, 7]
[1, 3, 4, 6, 7].filter(number => number <= 4); // -> [1, 3, 4]

因此,要过滤过去的日期/时间,只需将它们与今天的日期进行比较。唯一棘手的事情是,将2018-06-07这样的字符串(仅日期,未指定时间)赋给new Date(…),将时间设置为当前时间:

new Date("2018-06-07"); // -> Thu Jun 07 2018 01:00:00 GMT+0100

如果您只需要按天而不是数小时甚至数分钟进行比较,则可以方便地将时间设置为午夜之前:

(new Date("2018-06-07")).setHours(0) // -> Thu Jun 07 2018 00:00:00 GMT+0100

所以,当放在一起时:

const data = {
  events: [
    { name: "Event 1", date: "2018-06-12" },
    { name: "Event 2", date: "2018-07-10" },
    { name: "Event 3", date: "2018-07-12" },
    { name: "Event 4", date: "2018-07-13" },
    { name: "Event 5", date: "2018-08-01" }
  ]
}

const today = (new Date()).setHours(0) // past midnight

const todayAndFutureEvents = data.events.filter(event => (new Date(event.date)) >= today);

console.log(todayAndFutureEvents);

如果您的事件跨越多个时区,则可能会出现另一个问题,但这可能超出了此问题的范围……

答案 1 :(得分:0)

如果将该字符串传递给新的Date(yourString)函数,它将返回一个JavaScript日期对象。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

示例:

const newDate = new Date('2008-09-15T15:53:00')
// Will return a date object with the value of:
// Mon Sep 15 2008 15:53:00 GMT-0700 (Pacific Daylight Time)

const currentDate = Date.now();
// Will return a date object with the current date.

console.log(newDate < currentDate);
// Will compare the two dates.

答案 2 :(得分:0)

嗯,您并没有真正提供有关JSON结构以及已经实现的目标的足够信息,因此,如果这还不够,请添加更多详细信息,但是我想是这样的:

var eventsFromMyJSONstring = JSON.parse(theJSONstringFetchedFromCertainURL);
 var currentDate = new Date();
 eventsFromMyJSONstring.forEach(function(iEvent) {
    iEvent.newVarAsDate = new Date(iEvent.textDate);
    if (iEvent.newVarAsDate >= currentDate) {
        alert('hey, this object is from today or future');
    }
});

编辑:另外,也许您想使用过滤器来获取当前和将来的事件……类似:

var currentAndFutureEvents = eventsFromMyJSONstring.filter((iEvent) => new Date(iEvent.textDate) >= new Date());

(假设那里有ES6 ...)

答案 3 :(得分:0)

正如Simeon所说,我的看法是相同的,我想补充一点点信息。

获得日期后,您需要做两件事,

  • 首先要检查它是否是有效日期
  • 是否即将到来/将来的日期。

您尚未添加有关示例日期JSON的问题,我假设您具有如下所示的JSON。

[
    {name: "Something", date: "12-12-2018"},
    {name: "Something", date: "12-12-2017"},
    {name: "Something", date: "12-12-2019"},
    {name: "Something", date: "12-5-2018"},
    {name: "Something", date: "12-2-2018"},
    {name: "Something", date: "SOMETHING_INVALID"},
    {name: "Something", date: "12-12-2016"},
]

您可以使用过滤器这样过滤有效日期和将来的日期,

let dates = [
    {name: "Something", date: "1-12-2018"},
    {name: "Something", date: "2-12-2017"},
    {name: "Something", date: "3-12-2019"},
    {name: "Something", date: "4-5-2018"},
    {name: "Something", date: "5-2-2018"},
    {name: "Something", date: "InvalidSomething"},
    {name: "Something", date: "7-12-2016"},
]

let filteredDates = dates.filter((item) => {
    let date = new Date(item.date);
    if(date !== 'Invalid Date' && Date.now() < date.getTime()){
        return item;
    }
});


console.log(filteredDates);

很少澄清: Date.now()date.getTime()都用于获取timestamp,并且我正在JavaScript过滤器内部进行比较,如果date对象未返回"Invalid Date"字符串,并且**时间戳记的数字大于今天的时间戳,则它是将来的日期。

当这两个条件匹配时,filter将返回由object变量收集的整个filteredDates。循环完成后,您将获得阵列以供进一步使用。干杯!