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.
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));
An algorithm is:
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.
Eg
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)));
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.