Как объединить свойства внутри объекта в одно свойство? - PullRequest
1 голос
/ 05 ноября 2019

У меня есть объект заказов

{
  someUserData,
  createdAt: 2019-11-05T18:32:25.199+00:00,
  total: 5
}

Я хочу получить такую ​​структуру данных:

{
  2019: {
   0: 5,
   1: 100
   total: 999
  }

}

2019 - год0,1 и т. Д. - месяцы, общая стоимость справаИтого: годовой доход

Я пробовал это:


    calculateMonthlyRevenue = () => {
        const { orders } = this.state;
        const ordersMonthly = orders.map(x =>({
              ...x,
              year: new Date(x.createdAt).getFullYear(),
              month: new Date(x.createdAt).getMonth(),
            }
        ));
        const sumPerMonth = ordersMonthly.reduce((acc, cur) => {
            acc[cur.year] = acc[cur.year] + cur.total || cur.total;
            acc[cur.month] = acc[cur.month] + cur.total || cur.total;
            return acc;
        }, {})
    };

акк дает мне

{
  10: amount of all Novembers throught history,
  2019: I get the total amount, that is good but the data structure is not 
  what I need.
}

Я пробовал это:

acc[cur.year][cur.month] = acc[cur.year][cur.month] + cur.total || cur.total;

и это

acc[cur.year[cur.month]] = acc[cur.year[cur.month]] + cur.total || cur.total;

И я все еще застреваю.

Верхняя строка кодов дает мне

  9: amount
  undefined: amount

Последняя строка кода выдает ошибку (Невозможно прочитать свойство undefined из 10)

1 Ответ

0 голосов
/ 06 ноября 2019

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

Добавить коба целевых значения от исходного объекта.

var data = [{ someUserData: 'foo', createdAt: '2019-11-05T18:32:25.199+00:00', total: 5 }],
    result = data.reduce((r, { createdAt, total }) => {
        var [year, month] = createdAt.split('-', 2);
        r[year] = r[year] || { total: 0 };
        r[year][month -1 ] = (r[year][month - 1] || 0) + total;
        r[year].total += total;
        return r;
    }, {});

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...