我有一系列 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: {…}},
]
那是示例代碼。
uj5u.com熱心網友回復:
一個演算法是:
- 按時間屬性的值對資料進行排序
- 查找與開始日期同一天的第一天的索引
- 如果找到一個元素,則將該元素推入一個陣列
- 將搜索日期增加 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))));
更新以適應更新的要求。
uj5u.com熱心網友回復:
只需按 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));
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/421498.html
標籤:
