【问题标题】:Reduce Object array with same values减少具有相同值的对象数组
【发布时间】:2020-03-25 14:48:04
【问题描述】:

我有一个 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]++
  }
},[])

【问题讨论】:

  • 请添加代码。
  • @NinaScholz 什么代码对不起?
  • 你试过的代码。
  • 答案已更新

标签: javascript date datetime reduce higher-order-functions


【解决方案1】:

您可以将一个对象用于分组并将值作为结果数组。

您需要有效的日期。

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

【讨论】:

  • 在我看来,OP 有日期对象,而不是字符串,所以不确定 acc[date] 等是否会起作用。
  • ít 适用于日期实例new Date("2020-03-19"),因为Date 返回一个字符串作为对象的键,例如"Thu Mar 19 2020 01:00:00 GMT+0100 (Mitteleuropäische Normalzeit)"(德国位置),并将date 作为一个iso字符串"2020-03-19T00:00:00.000Z"。 (这很奇怪)。
  • 我认为 ISO 字符串来自 SO 控制台。如果在源对象中将“2020-03-19”替换为new Date("2020-03-19"),则result 对象值是日期字符串,而不是日期对象。只是小问题。 :-)
【解决方案2】:

如果你得到每个日期的时间戳,然后将它作为一个字符串添加到它必须创建一个字符串的状态之后。

示例对象

[{状态:“系统标签”,日期:Thu Mar 05 2020 01:00:00 GMT+0100(中欧标准时间)}

“系统标记为 1583366400”

然后你可以只对时间戳进行子串化以再次将其转换为日期

【讨论】:

  • 你能解释一下你希望做什么吗?
猜你喜欢
  • 1970-01-01
  • 2017-02-19
  • 2018-06-15
  • 1970-01-01
  • 2020-02-08
  • 2019-03-26
  • 2021-06-07
  • 1970-01-01
  • 2018-05-22
相关资源
最近更新 更多