简体   繁体   中英

Filter an array of ISO date by days of the week in javascript

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:

  1. Sort the data by the value of the time property
  2. 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)
  3. Find the index of the first day with a time that is equal to or later than the current date + n days
  4. 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.

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM