减少具有相同值的对象数组

Reduce Object array with same values

我有一个 Javascript 对象数组,其中包含两个重要值 datestatus

我想将它们缩减为唯一日期数组,其中所有值都被解析为一个对象,其中包含每个状态和日期。

我试过使用 reduce 函数,但我似乎无法正确收集 dates,因此无法正确收集所有数据。

独特的状态是:"System Labelled", "Discarded", "Saved", "Reviewed"

例如:

[{status: "System Labelled", date: Thu Mar 05 2020 01:00:00 GMT+0100 (Central European Standard Time)},
{status: "System Labelled", date: Thu Mar 05 2020 01:00:00 GMT+0100 (Central European Standard Time)},
{status: "System Labelled", date: Thu Mar 05 2020 02:00:00 GMT+0200 (Central European Summer Time)},
{status: "Discarded", date: Tue Mar 10 2020 01:00:00 GMT+0100 (Central European Standard Time)},
{status: "Saved", date: Sat Jan 11 2020 01:00:00 GMT+0100 (Central European Standard Time)}] 
---->
[{System Labelled: 1, Discarded: 0, Saved: 0, Reviwed: 0, date: Thu Mar 05 2020 01:00:00 GMT+0100 (Central European Standard Time)}, 
{System Labelled: 2, Discarded: 0, Saved: 0, Reviwed: 0, date:  Sun Apr 05 2020 02:00:00 GMT+0200 (Central European Summer Time)}, 
{System Labelled: 0, Discarded: 1, Saved: 0, Reviwed: 0, date:  Tue Mar 10 2020 01:00:00 GMT+0100 (Central European Standard Time)}, 
{System Labelled: 0, Discarded: 0, Saved: 1, Reviwed: 0, date:  Sat Jan 11 2020 01:00:00 GMT+0100 (Central European Standard Time)}, 

这是我目前的代码:

const objects= [{status: "System Labelled", date: new Date("19-03-2020")},
{status: "System Labelled", date: new Date("19-03-2020")},
{status: "Discarded", date:  new Date("19-03-2020")},
{status: "Saved", date:  new Date("19-03-2020")}]

objects.reduce((acc, curr) =>{
  console.log(acc.includes(curr.status))
  if(acc.includes(curr.status)){
    curr[acc.status]++
  }
},[])

如果您获取每个日期的时间戳,然后将其作为字符串添加到必须创建一个字符串的状态之后,会怎样。

示例对象

[{状态:"System Labelled",日期:2020 年 3 月 5 日星期四 01:00:00 GMT+0100(欧洲中部标准时间)}

会是

"System Labelled 1583366400"

然后您可以将时间戳子串化以再次将其转换为日期

您可以取一个对象进行分组,并将值作为结果数组。

您需要有效的日期。

const
    statuses = ["System Labelled", "Discarded", "Saved", "Reviewed"],
    objects = [{ status: "System Labelled", date: "2020-03-19" }, { status: "System Labelled", date: "2020-03-19" }, { status: "Discarded", date: "2020-03-19" }, { status: "Saved", date: "2020-03-19" }],
    result = Object.values(objects.reduce((acc, { status, date }) => {
        acc[date] = acc[date] || { date, ...Object.fromEntries(statuses.map(k => [k, 0])) };
        acc[date][status]++;
        return acc;
    }, {}));

   console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }