【问题标题】:Finding date closest to today from array of objects从对象数组中查找最接近今天的日期
【发布时间】:2019-01-19 07:53:42
【问题描述】:

我解析了一个像这样切片的 CSV:

data[0]
>>Date:08/23/2018, Organizer:RadioShack, Event:Promotion

我在Find closest date in array with JavaScript 中发现了一个有点帮助的问题,但是我在将它从日期数组调整为存储在对象数组中的日期时遇到了麻烦。我的日期从data[0]data[10]。这不是一个非常长的数据集,但是我想比我目前的粗略方法更好地编码它:

var dateArray = [];
dateArray[0] = data[0].Date;
dateArray[1] = data[1].Date;
…

console.log(dateArray.filter(function(d) {return d - today > 0; }))

这给了我今天日期之后的所有日期,这是一个开始,但我仍然无法找到最接近今天的日期。

问题:我想也许我可以写一个 for 循环来更快地给我这个数组,但我仍然想知道:有没有办法可以从数组中找到最接近今天的日期对象并将该日期存储在:

var closestEventDate = ???

【问题讨论】:

  • 对过滤后的数组中的日期进行升序排序,并从中取出第一个日期
  • @KooiInc - 这比必要的工作多。

标签: javascript


【解决方案1】:

除了乔纳斯的回答。使用dayjs库的类似方法

arrayOfDates.reduce((a, b) => dayjs(a.Date).isAfter(dayjs(b.Date)) ? a : b);

【讨论】:

    【解决方案2】:

    您可以将 dateArray 减少到最接近今天的日期:

     const today = new Date();
     const closest = data.reduce((a, b) => a.Date - today < b.Date - today ? a : b);
    

    现场示例:

    var now = Date.now();
    var ONE_DAY_IN_MS = 86400000;
    function randomDate() {
      return new Date(now + (5 * ONE_DAY_IN_MS - Math.round(Math.random() * 10 * ONE_DAY_IN_MS)));
    }
    var data = [
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()}
    ];
    
    console.log("Entries:");
    data.forEach(function(entry) {
      console.log(entry.Date.toISOString());
    });
    
    const today = new Date();
    const closest = data.reduce((a, b) => a.Date - today < b.Date - today ? a : b);
    
    console.log("today", today.toISOString());
    console.log("closest", closest.Date.toISOString());
    .as-console-wrapper {
      max-height: 100% !important;
    }

    或今天最近的之后

    const today = new Date();
    const closest = data.reduce((a, b) => {
      const adiff = a.Date - today;
      return adiff > 0 && adiff < b.Date - today ? a : b;
    });
    

    现场示例:

    var now = Date.now();
    var ONE_DAY_IN_MS = 86400000;
    function randomDate() {
      return new Date(now + (5 * ONE_DAY_IN_MS - Math.round(Math.random() * 10 * ONE_DAY_IN_MS)));
    }
    var data = [
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()},
      {Date: randomDate()}
    ];
    
    console.log("Entries:");
    data.forEach(function(entry) {
      console.log(entry.Date.toISOString());
    });
    
    const today = new Date();
    const closest = data.reduce((a, b) => {
      const adiff = a.Date - today;
      return adiff > 0 && adiff < b.Date - today ? a : b;
    });
    
    console.log("today", today.toISOString());
    console.log("closest", closest.Date.toISOString());
    .as-console-wrapper {
      max-height: 100% !important;
    }

    【讨论】:

    • 很高兴看到reduce有效使用!
    • @JonasWilms 不知道为什么,但是当我将 &amp;&amp; adiff &lt; b.Date - today 切换到 &amp;&amp; adiff &gt; b.Date - today 时,今天之后最接近的才对我正常工作;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多