I have an array of ISO dates I'm trying to sort and get only the next seven days from it
Here is the sample
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: {…}},
]
That is the sample code.
CodePudding user response:
just sort by Array.sort and pick the first n elements of an array by Array.slice
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));
CodePudding user response:
An algorithm is:
- Sort the data by the value of the time property
- Find the index of the first day with a time that is equal to or later than the supplied date (default is the current date)
- Find the index of the first day with a time that is equal to or later than the current date n days
- Get all entries from the first index to the second index minus 1
A lexical sort is used to sort on time and to find the records to return as it's an ISO 8601 string. Conversion to Date objects will work too but that seems unnecessary.
For the compare strings the local time is set to the start of the day using setHours. If that doesn't suit, change it.
E.g.
function getNextNDays(data, n, date = new Date()) {
data.sort((a, b) => a.time.localeCompare(b.time));
let d = new Date(date);
d.setHours(0,0,0,0);
let startDate = d.toISOString();
d.setDate(d.getDate() Number(n));
let endDate = d.toISOString();
let startIndex = data.findIndex(obj => obj.time >= startDate);
let endIndex = data.findIndex(obj => obj.time >= endDate);
// If no suitable record found for start, return
if (startIndex == -1) return [];
if (endIndex == -1) endIndex = data.length;
// Debug
console.log(`Extracting data for ${endIndex - startIndex} records from: `
`\n${startDate} to \n${endDate}`);
// Return array of selected values
return data.slice(startIndex, endIndex);
}
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(getNextNDays(daysdata, 7, new Date(2022,0,23)));
