用javascript按一周中的几天筛选ISO日期数组



我有一个ISO日期数组,我正在尝试排序,只从中获得接下来的七天

这是的样本

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: {…}},    
]

这是示例代码。

一种算法是:

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

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

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

如果这应该基于本地日期,则使用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))));

更新以适应更新的要求。

只需按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));

最新更新