Search code examples
javascriptarraysobjectisodate

How to get unique date values from object array


I need to get all unique days of multiple date values in the format DD.MM.. In this example data, there are two values for the 24th of december:

const data = [
    { date: ISODate("2019-12-24T03:24:00Z") },
    { date: ISODate("2019-12-24T04:56:00Z") },
    { date: ISODate("2019-12-25T02:34:00Z") },
    { date: ISODate("2019-12-26T01:23:00Z") }
]

So the result should be

const result = [
    '24.12.',
    '25.12.',
    '26.12.'
]

So first of all I'll map my data and split the values only for the dates:

const dates = data.map(d => d.date.toString().split('T')[0])

But how do I get the unique values and change the output format?


Update

I came up with this, but it looks very complicated...

data.map(d => {
  const dateSplit = d.date.toString().split('T')[0].split('-')
  return dateSplit[2] + '.' + dateSplit[1] + '.'
})
.filter((value, index, self) {
  return self.indexOf(value) === index
})

Solution

  • It seems that ISODate returns a standard JS Date object. You can use Date.getDate() to get the day, and Date.getMonth() to get the month (0 based, so we need to add 1):

    const data = [
      { date: new Date('2019-12-24T03:24:00Z') },
      { date: new Date('2019-12-24T04:56:00Z') },
      { date: new Date('2019-12-25T02:34:00Z') },
      { date: new Date('2019-12-26T01:23:00Z') }
    ]
    
    const result = [...new Set(data.map(({ date: d }) => 
      `${d.getDate()}.${d.getMonth() + 1}.`
    ))]
    
    console.log(result)

    Previous answer:

    Use a regular expression to match the month and the day, and assign them to consts using destructuring. Assemble the string using template literal. Remove duplicates by assigning the values to a Set, and then spreading back to an array.

    Note: Since I don't have access to the ISODate, I've removed it. I left .toString() although it's not needed in this example, but will be needed when used with ISODate.

    const data = [
      { date: '2019-12-24T03:24:00Z' },
      { date: '2019-12-24T04:56:00Z' },
      { date: '2019-12-25T02:34:00Z' },
      { date: '2019-12-26T01:23:00Z' }
    ]
    
    const pattern = /-([0-9]{2})-([0-9]{2})T/
    
    const result = [...new Set(data.map(d => {
      const [, mon, day] = d.date.toString().match(pattern)
      
      return `${day}.${mon}.`;
    }))]
    
    console.log(result)