0

如何在不重复或删除基于日期的相同日期数据的情况下合并或合并

[
  {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"}
]

如何合并重复数据并按升序排列日期顺序。

例如

[
  {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"}
]

[
  {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"}
]

我要做的是合并重复的日期并按升序排列。

4

4 回答 4

1

鉴于对象结构就像您提供的那样:

  • 首先,使用Set删除重复项,因为 Set 将允许您存储唯一值。记得在添加到 Set 之前对对象进行字符串化,因为{ date: "05/18/2021" }{ date: "05/18/2021" }是两个不同的对象引用,但相同的原始字符串值

Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用

  • 按日期排序,通过转换为 Date 和 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)

于 2021-09-08T04:54:38.533 回答
1

您可以使用Set获取唯一值,然后localeCompare在转换为YYYY-MM-DD可以按字典顺序排序的格式后对日期进行排序。

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);

于 2021-09-08T04:55:32.727 回答
1

首先,您必须使用 对数组进行排序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
})

然后你必须创建一个Set起始日期。在此处阅读有关它们的更多信息

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

最后,您必须从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
)

于 2021-09-08T04:48:05.347 回答
0

使用Array.reduce()andSet删除重复值并应用于Array.sort()对日期进行排序。

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));

于 2021-09-08T05:26:56.543 回答