Уменьшить массив объектов теми же значениями - PullRequest
0 голосов
/ 25 марта 2020

У меня есть массив Javascript Объектов, которые содержат два важных значения date и status

Я хочу сократить их до массива уникальных дат, где все значения анализируются в объект, который содержит каждый статус и дату.

Я пытался использовать функцию сокращения, но я не могу собрать date правильно, чтобы все данные были собраны правильно .

Уникальные статусы: "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]++
  }
},[])

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Вы можете взять объект для группировки и получить значения в виде массива результатов.

Вам нужны действительные даты для него.

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; }
0 голосов
/ 25 марта 2020

что если вы получите временную метку каждой даты, а затем добавите ее в виде строки после статуса, для которого необходимо создать одну единственную строку.

Пример объекта

[{status: «Система помечена», дата: чт 05 марта 2020 01:00:00 GMT + 0100 (центральноевропейское стандартное время)}

будет

«Системная метка 1583366400»

И тогда вы можете просто вставить временную метку, чтобы снова преобразовать ее в дату

...