【问题标题】:Filter an array of ISO date by days of the week in javascript在javascript中按星期几过滤ISO日期数组
【发布时间】:2022-01-23 09:27:05
【问题描述】:

我有一个 ISO 日期数组,我正在尝试对其进行排序并从中获取接下来的 7 天

这里是示例

Here is the sample code

daysdata = [{time: '2022-01-23T11:00:00Z', data: {…}},   
     {time: '2022-01-23T12:00:00Z', data: {…}},   
     {time: '2022-01-24T11:00:00Z', data: {…}},   
     {time: '2022-01-24T12:00:00Z', data: {…}},   
     {time: '2022-01-24T17:00:00Z', data: {…}},   
     {time: '2022-01-24T23:00:00Z', data: {…}},   
     {time: '2022-01-25T00:00:00Z', data: {…}},   
     {time: '2022-01-25T04:00:00Z', data: {…}},   
     {time: '2022-01-25T05:00:00Z', data: {…}},   
     {time: '2022-01-25T06:00:00Z', data: {…}},    
     {time: '2022-01-25T07:00:00Z', data: {…}},   
     {time: '2022-01-25T14:00:00Z', data: {…}},        
     {time: '2022-01-25T15:00:00Z', data: {…}},    
     {time: '2022-01-26T13:00:00Z', data: {…}},
     {time: '2022-01-26T14:00:00Z', data: {…}},
     {time: '2022-01-26T15:00:00Z', data: {…}},
     {time: '2022-01-27T13:00:00Z', data: {…}},
     {time: '2022-01-27T14:00:00Z', data: {…}},
     {time: '2022-01-27T15:00:00Z', data: {…}},
     {time: '2022-01-28T14:00:00Z', data: {…}},     
     {time: '2022-01-28T15:00:00Z', data: {…}},    
     {time: '2022-01-28T16:00:00Z', data: {…}},    
     {time: '2022-01-29T18:00:00Z', data: {…}},    
     {time: '2022-01-29T19:00:00Z', data: {…}},    
     {time: '2022-01-30T08:00:00Z', data: {…}},    
     {time: '2022-01-30T09:00:00Z', data: {…}},    
     {time: '2022-01-30T10:00:00Z', data: {…}},    
     {time: '2022-01-30T11:00:00Z', data: {…}},    
    ]

这是示例代码。

【问题讨论】:

  • 你的示例代码在哪里?出了什么问题?
  • 您是指从今天(当天)开始的接下来的 7 天吗?
  • 使用.getTime()将您的日期转换为纪元,然后您可以使用数组过滤器与您所需的日期进行比较
  • @seb_dom 是的,我只想从今天开始获得接下来的 7 天,并且您可以看到一天中有多个日期时间。
  • @NinaScholz 问题是数组中一天中有几个时间,首先我需要从当前日期开始的接下来的 7 天按日期过滤。

标签: javascript arrays sorting datetime angular-moment


【解决方案1】:

算法是:

  1. 按时间属性的值对数据进行排序
  2. 查找与开始日期同一天的第一天的索引
  3. 如果找到一个元素,则将该元素推入一个数组中
  4. 将搜索日期增加 1 天

词法排序用于按时间进行排序并找到要返回的记录,因为它是一个 ISO 8601 字符串。转换为 Date 对象也可以,但这似乎没有必要。

要选择每个日期,dStart 设置为 UTC 日的开始,dEnd 设置为 UTC 日的结束。如果在该范围内未找到日期,则不会将任何日期添加到数组中。这可以防止数据中出现多天间隔的情况,从而在 selected 数组中产生同一对象的多个条目(即间隔之后的第一个条目)。

如果这应该基于当地日期,则使用 setHours 而不是 setUTCHours

/* Given data as an array of objects, return
 * first on date plus first on next n days
 * Dates are UTC, not local
 */
function getFirstNDays(data, n = 1, date = new Date()) {

  // Make sure n is a positive integer
  if (n % 1 || n < 0) return;

  data.sort((a, b) => a.time.localeCompare(b.time)); 

  let dStart = new Date(date);
  dStart.setUTCHours(0,0,0,0);

  let dEnd = new Date(dStart);
  dEnd.setUTCHours(23,59,59,999);
  let selected = [];
  
  while (n--) {
    let index = data.findIndex(obj => obj.time >= dStart.toISOString() && obj.time <= dEnd.toISOString());

    // If record found, add to selected array
    if (index != -1) {
      selected.push(data[index]);
    }

    dStart.setUTCDate(dStart.getUTCDate() + 1);
    dEnd.setUTCDate(dEnd.getUTCDate() + 1);
  }

  // Return selected values
  return selected;
}

let daysdata = [
  {time: '2022-01-20T11:00:00Z', data: {}},   
  {time: '2022-01-23T11:00:00Z', data: {}},   
  {time: '2022-01-23T12:00:00Z', data: {}},   
  {time: '2022-01-24T11:00:00Z', data: {}},   
  {time: '2022-01-24T12:00:00Z', data: {}},   
  {time: '2022-01-24T17:00:00Z', data: {}},   
  {time: '2022-01-24T23:00:00Z', data: {}},   
  {time: '2022-01-25T00:00:00Z', data: {}},   
  {time: '2022-01-25T04:00:00Z', data: {}},   
  {time: '2022-01-25T05:00:00Z', data: {}},   
  {time: '2022-01-25T06:00:00Z', data: {}},    
  {time: '2022-01-25T07:00:00Z', data: {}},   
  {time: '2022-01-25T14:00:00Z', data: {}},        
  {time: '2022-01-25T15:00:00Z', data: {}},    
  {time: '2022-01-26T13:00:00Z', data: {}},
  {time: '2022-01-26T14:00:00Z', data: {}},
  {time: '2022-01-26T15:00:00Z', data: {}},
  {time: '2022-01-27T13:00:00Z', data: {}},
  {time: '2022-01-27T14:00:00Z', data: {}},
  {time: '2022-01-27T15:00:00Z', data: {}},
  {time: '2022-01-28T14:00:00Z', data: {}},     
  {time: '2022-01-28T15:00:00Z', data: {}},    
  {time: '2022-01-28T16:00:00Z', data: {}},    
  {time: '2022-01-29T18:00:00Z', data: {}},    
  {time: '2022-01-29T19:00:00Z', data: {}},    
  {time: '2022-01-30T08:00:00Z', data: {}},    
  {time: '2022-01-30T09:00:00Z', data: {}},    
  {time: '2022-01-30T10:00:00Z', data: {}},    
  {time: '2022-01-30T11:00:00Z', data: {}},    
];

console.log(getFirstNDays(daysdata, 7, new Date(Date.UTC(2022,0,23))));

已更新以适应更新的要求。

【讨论】:

  • 谢谢,但也许我的问题没有从上面的答案中正确提出,它对前七个日期时间进行排序,但我需要的是排序并只选择同一日期数组中的第一个索引。就像只排序 2022-01-23T11:00:00Z ,下一个新日期是 2022-01-24T11:00:00Z 等等......
  • @Ojhey — 上面对整个数组进行排序,而不仅仅是前七个元素。答案中有足够的信息来编写符合您更新标准的内容。例如。获取 startIndex,将日期递增一天,获取下一个 startIndex,依此类推。
  • -谢谢你的救命稻草!!!……正是我要找的东西
【解决方案2】:

只需按 Array.sort 排序,然后按 Array.slice 选取数组的前 n 个元素

 

daysdata = [{time: '2022-01-23T11:00:00Z', data: {}},   
     {time: '2022-01-23T12:00:00Z', data: {}},   
     {time: '2022-01-24T11:00:00Z', data: {}},   
     {time: '2022-01-24T12:00:00Z', data: {}},   
     {time: '2022-01-24T17:00:00Z', data: {}},   
     {time: '2022-01-24T23:00:00Z', data: {}},   
     {time: '2022-01-25T00:00:00Z', data: {}},   
     {time: '2022-01-25T04:00:00Z', data: {}},   
     {time: '2022-01-25T05:00:00Z', data: {}},   
     {time: '2022-01-25T06:00:00Z', data: {}},    
     {time: '2022-01-25T07:00:00Z', data: {}},   
     {time: '2022-01-25T14:00:00Z', data: {}},        
     {time: '2022-01-25T15:00:00Z', data: {}},    
     {time: '2022-01-26T13:00:00Z', data: {}},
     {time: '2022-01-26T14:00:00Z', data: {}},
     {time: '2022-01-26T15:00:00Z', data: {}},
     {time: '2022-01-27T13:00:00Z', data: {}},
     {time: '2022-01-27T14:00:00Z', data: {}},
     {time: '2022-01-27T15:00:00Z', data: {}},
     {time: '2022-01-28T14:00:00Z', data: {}},     
     {time: '2022-01-28T15:00:00Z', data: {}},    
     {time: '2022-01-28T16:00:00Z', data: {}},    
     {time: '2022-01-29T18:00:00Z', data: {}},    
     {time: '2022-01-29T19:00:00Z', data: {}},    
     {time: '2022-01-30T08:00:00Z', data: {}},    
     {time: '2022-01-30T09:00:00Z', data: {}},    
     {time: '2022-01-30T10:00:00Z', data: {}},    
     {time: '2022-01-30T11:00:00Z', data: {}},    
    ];

   sortData = daysdata.sort((a,b) => (a.time < b.time) ? 1 : ((b.time < a.time) ? -1 : 0));

   console.log(sortData.slice(0,7));

【讨论】:

  • 谢谢,但我不只是按数组的前七个元素排序,因为数组中一天中有多个日期时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多