0

How to combine or merge without duplicating or remove the same date data based on the date

[
  {date: "05/18/2021"},
  {date: "05/19/2021"},
  {date: "05/20/2021"},
  {date: "05/21/2021"},
  {date: "05/22/2021"},
  {date: "05/10/2021"},
  {date: "05/11/2021"},
  {date: "05/12/2021"},
  {date: "05/13/2021"},
  {date: "05/14/2021"},
  {date: "05/15/2021"},
  {date: "05/03/2021"},
  {date: "05/04/2021"},
  {date: "05/29/2021"},
  {date: "05/17/2021"},
  {date: "05/18/2021"},
  {date: "05/19/2021"},
  {date: "05/20/2021"},
  {date: "05/21/2021"},
  {date: "05/22/2021"},
  {date: "05/10/2021"},
  {date: "05/11/2021"},
  {date: "05/12/2021"},
  {date: "05/13/2021"},
  {date: "05/20/2021"},
  {date: "05/21/2021"},
  {date: "05/22/2021"},
  {date: "05/10/2021"},
  {date: "05/11/2021"},
  {date: "05/12/2021"},
  {date: "05/13/2021"},
  {date: "05/14/2021"},
  {date: "05/15/2021"}
]

How to merge the duplicate data and arrange the date order by ascending.

for example

[
  {date: "05/03/2021"},
  {date: "05/04/2021"},
  {date: "05/05/2021"},
  {date: "05/06/2021"},
  {date: "05/06/2021"},
  {date: "05/07/2021"},
  {date: "05/31/2021"},
  {date: "05/08/2021"},
  {date: "05/31/2021"},
  {date: "05/24/2021"},
  {date: "05/25/2021"},
  {date: "05/26/2021"}
]

to

[
  {date: "05/03/2021"},
  {date: "05/04/2021"},
  {date: "05/05/2021"},
  {date: "05/06/2021"},
  {date: "05/07/2021"},
  {date: "05/08/2021"},
  {date: "05/24/2021"},
  {date: "05/25/2021"},
  {date: "05/26/2021"},
  {date: "05/31/2021"}
]

What I'm trying to do is the merge the duplicate date and arrange it order by ascending.

  • 4
    Sounds like you want to do two easily searchable things... 1) [Remove duplicates from an array of objects](https://stackoverflow.com/questions/2218999/how-to-remove-all-duplicates-from-an-array-of-objects), and 2) [Sort an array of objects by date property](https://stackoverflow.com/questions/10123953/how-to-sort-an-object-array-by-date-property). Mind you, it would be a lot easier if your date strings were in ISO 8601 format – Phil Sep 08 '21 at 04:36
  • 1
    Given that OP has to sort the array afterward anyway, it is safe to goes the [`Set` approach](https://stackoverflow.com/a/44601543/10317684) to remove duplicates – Ricky Mo Sep 08 '21 at 04:50

4 Answers4

0

First you have to sort your array with date.

a.sort((a, b) => {
  let tmpA = a.date.split('/');
  tmpA = `${tmpA[2]}${tmpA[0]}${tmpA[1]}` // change the format of date to YYYYMMDD

  let tmpB = b.date.split('/');
  tmpB = `${tmpB[2]}${tmpB[0]}${tmpB[1]}` // change the format of date to YYYYMMDD
  return +tmpA - +tmpB
})

Then you have to create a Set from dates. Read more about them here

let set = new Set(a.map(itm => itm.date));

Finally you have to create your array from the set

Array.from(set).map(itm => ({
  date: itm
}))

let a = [{ date: "05/18/2021" }, { date: "05/19/2021" }, { date: "05/20/2021" }, { date: "05/21/2021" }, { date: "05/22/2021" }, { date: "05/10/2021" }, { date: "05/11/2021" }, { date: "05/12/2021" }, { date: "05/13/2021" }, { date: "05/14/2021" }, { date: "05/15/2021" }, { date: "05/03/2021" }, { date: "05/04/2021" }, { date: "05/29/2021" }, { date: "05/17/2021" }, { date: "05/18/2021" }, { date: "05/19/2021" }, { date: "05/20/2021" }, { date: "05/21/2021" }, { date: "05/22/2021" }, { date: "05/10/2021" }, { date: "05/11/2021" }, { date: "05/12/2021" }, { date: "05/13/2021" }, { date: "05/20/2021" }, { date: "05/21/2021" }, { date: "05/22/2021" }, { date: "05/10/2021" }, { date: "05/11/2021" }, { date: "05/12/2021" }, { date: "05/13/2021" }, { date: "05/14/2021" }, { date: "05/15/2021" } ];

a = a.sort((a, b) => {
  let tmpA = a.date.split('/');
  tmpA = `${tmpA[2]}${tmpA[0]}${tmpA[1]}` // change the format of date to YYYYMMDD

  let tmpB = b.date.split('/');
  tmpB = `${tmpB[2]}${tmpB[0]}${tmpB[1]}` // change the format of date to YYYYMMDD
  return +tmpA - +tmpB
})

let set = new Set(a.map(itm => itm.date));

let result = Array.from(set).map(itm => ({
  date: itm
}))

console.log(
  result
)
Saeed
  • 5,413
  • 3
  • 26
  • 40
0

Given that the object structure is like what you provided:

  • first, remove duplicate with Set, since Set will allow you to store unique values. Remember to stringify objects before adding to Set, because { date: "05/18/2021" } and { date: "05/18/2021" } are two different object references, but the same primitive string values

The Set object lets you store unique values of any type, whether primitive values or object references.

  • sort by date, by converting to Date and getTime

const data = [ { date: "05/18/2021" }, { date: "05/19/2021" }, { date: "05/20/2021" }, { date: "05/21/2021" }, { date: "05/22/2021" }, { date: "05/10/2021" }, { date: "05/11/2021" }, { date: "05/12/2021" }, { date: "05/13/2021" }, { date: "05/14/2021" }, { date: "05/15/2021" }, { date: "05/03/2021" }, { date: "05/04/2021" }, { date: "05/29/2021" }, { date: "05/17/2021" }, { date: "05/18/2021" }, { date: "05/19/2021" }, { date: "05/20/2021" }, { date: "05/21/2021" }, { date: "05/22/2021" }, { date: "05/10/2021" }, { date: "05/11/2021" }, { date: "05/12/2021" }, { date: "05/13/2021" }, { date: "05/20/2021" }, { date: "05/21/2021" }, { date: "05/22/2021" }, { date: "05/10/2021" }, { date: "05/11/2021" }, { date: "05/12/2021" }, { date: "05/13/2021" }, { date: "05/14/2021" }, { date: "05/15/2021" }, ]

const rejectDuplicates = arr => {
  return Array.from(
    arr
      .map(el => JSON.stringify(el))
      .reduce((set, el) => set.add(el), new Set())
  ).map(el => JSON.parse(el))
}

const compareDateFn = ({ date: dateA }, { date: dateB }) => {
  const timeA = new Date(dateA).getTime()
  const timeB = new Date(dateB).getTime()
  return timeA - timeB
}

const res = rejectDuplicates(data).sort(compareDateFn)

console.log(res)
hgb123
  • 13,869
  • 3
  • 20
  • 38
0

You can use Set to get unique values and then use localeCompare to sort date after converting to YYYY-MM-DD format which could be lexicographically sorted.

const input = [ {date: "05/18/2021"}, {date: "05/19/2021"}, {date: "05/20/2021"}, {date: "05/21/2021"}, {date: "05/22/2021"}, {date: "05/10/2021"}, {date: "05/11/2021"}, {date: "05/12/2021"}, {date: "05/13/2021"}, {date: "05/14/2021"}, {date: "05/15/2021"}, {date: "05/03/2021"}, {date: "05/04/2021"}, {date: "05/29/2021"}, {date: "05/17/2021"}, {date: "05/18/2021"}, {date: "05/19/2021"}, {date: "05/20/2021"}, {date: "05/21/2021"}, {date: "05/22/2021"}, {date: "05/10/2021"}, {date: "05/11/2021"}, {date: "05/12/2021"}, {date: "05/13/2021"}, {date: "05/20/2021"}, {date: "05/21/2021"}, {date: "05/22/2021"}, {date: "05/10/2021"}, {date: "05/11/2021"}, {date: "05/12/2021"}, {date: "05/13/2021"}, {date: "05/14/2021"}, {date: "05/15/2021"} ],
      result = [...new Set(input.map(o => o.date))]
                .map(date => ([date, date.replace(/(..)\/(..)\/(....)/, '$3-$1-$2')]))
                .sort((a,b) => a[1].localeCompare(b[1]))
                .map(([date]) => ({date}));
console.log(result);
Hassan Imam
  • 21,956
  • 5
  • 41
  • 51
0

Use Array.reduce() and Set to remove duplicate values and apply Array.sort() to sort the dates.

const dates = [
  { date: "05/03/2021" },
  { date: "05/04/2021" },
  { date: "05/05/2021" },
  { date: "05/06/2021" },
  { date: "05/06/2021" },
  { date: "05/07/2021" },
  { date: "05/31/2021" },
  { date: "05/08/2021" },
  { date: "05/31/2021" },
  { date: "05/24/2021" },
  { date: "05/25/2021" },
  { date: "05/26/2021" }
];

const removeDuplicateAndSort = (list) => {
  const set = new Set();
  const uniqueItems = list.reduce((finalList, dateObj) => {
    if (!set.has(dateObj.date)) {
      finalList.push(dateObj);
      set.add(dateObj.date);
    }
    return finalList
  }, []);
  return uniqueItems.sort((obj1, obj2) => new Date(obj1.date) - new Date(obj2.date));
}

console.log(removeDuplicateAndSort(dates));
Rahul Kumar
  • 3,009
  • 2
  • 16
  • 22