Приведенный ниже код добавляет элемент объекта с доходом = 0 для одной из трех категорий (класс, мастерская, обучение), если они отсутствуют в этом месяце (поэтому необходимо оценить комбинацию категории и месяц свойства каждого элемента)
const rawdata = [
{ category: 'Class', month: '2018-12-01T00:00:00.000Z', revenue: 100 },
{ category: 'Workshop', month: '2018-12-01T00:00:00.000Z', revenue: 140 },
{ category: 'Training', month: '2018-12-01T00:00:00.000Z', revenue: 300 },
{ category: 'Class', month: '2019-01-01T00:00:00.000Z', revenue: 200 },
{ category: 'Workshop', month: '2019-01-01T00:00:00.000Z', revenue: 200 },
{ category: 'Class', month: '2019-02-01T00:00:00.000Z', revenue: 134 },
{ category: 'Workshop', month: '2019-02-01T00:00:00.000Z', revenue: 124 },
...
];
const categories = Array.from(new Set(rawdata.map(x => x.category)));
const months = Array.from(new Set(rawdata.map(x => x.month)));
for(const month of months) {
for(const category of categories) {
const found = rawdata.find(element => element.month == month && element.category == category);
if(!found) rawdata.push({ month, category, revenue: 0 });
}
}
Это меняет массив выше на (обратите внимание на элементы с доходом: 0):
[
{ category: 'Class', month: '2018-12-01T00:00:00.000Z', revenue: 100 },
{ category: 'Workshop', month: '2018-12-01T00:00:00.000Z', revenue: 140 },
{ category: 'Training', month: '2018-12-01T00:00:00.000Z', revenue: 300 },
{ category: 'Class', month: '2019-01-01T00:00:00.000Z', revenue: 200 },
{ category: 'Workshop', month: '2019-01-01T00:00:00.000Z', revenue: 200 },
// Next object element was added
{ category: 'Training', month: '2019-01-01T00:00:00.000Z', revenue: 0 }
{ category: 'Class', month: '2019-02-01T00:00:00.000Z', revenue: 134 },
{ category: 'Workshop', month: '2019-02-01T00:00:00.000Z', revenue: 124 },
// Next object element was added
{ category: 'Training', month: '2019-02-01T00:00:00.000Z', revenue: 0 }
...
];
Есть ли более элегантный подходить? То, что я делаю, работает, но не кажется эффективным.