Вот один подход, не использующий библиотеку:
const collectSales = (candy) => Object .entries (candy .reduce (
(a, {candyName, data}) => data .reduce (
(a, {date, sold, o = a[date] || {}, c = o[candyName] || 0}) =>
({...a, [date]: {...o, [candyName]: c + sold}}),
a
),
{}
))
.map ( ([date, candySold]) => ({date, candySold}) )
const candyDataSoldByEachDayInYear2000 = [{candyName:"snickers",data:[{date:"2000-01-01",sold:100},{date:"2000-01-02",sold:110}]},{candyName:"kitkat",data:[{date:"2000-01-01",sold:80},{date:"2000-01-02",sold:70}]},{candyName:"twix",data:[{date:"2000-01-01",sold:60},{date:"2000-01-02",sold:50}]},{candyName:"milkyway",data:[{date:"2000-01-01",sold:60},{date:"2000-01-02",sold:70}]},{candyName:"skittles",data:[{date:"2000-01-01",sold:120},{date:"2000-01-02",sold:110}]}];
console .log (
collectSales (candyDataSoldByEachDayInYear2000)
)
Эта версия использует reduce
для преобразования данных в нечто вроде:
{
"2000-01-01": {
kitkat: 80,
milkyway: 60,
skittles: 120,
snickers: 100,
twix: 60
},
"2000-01-02": {
kitkat: 70,
milkyway: 70,
skittles: 110,
snickers: 110,
twix: 50
}
}
, а затем переносит результат в Object.entries
с последующимпростой map
оператор.
Обновление
Вышеуказанное изменение этой версии:
const collectSales = (candy) => Object.entries ( candy .reduce (
(a, {candyName, data}) => data .reduce (
(a, {date, sold}) =>
({...a, [date]: {...(a[date] || {}), [candyName]: ((a[date] || {})[candyName] || 0) + sold}}),
a
),
{}
))
.map ( ([date, candySold]) => ({date, candySold}) )
const candyDataSoldByEachDayInYear2000 = [{candyName:"snickers",data:[{date:"2000-01-01",sold:100},{date:"2000-01-02",sold:110}]},{candyName:"kitkat",data:[{date:"2000-01-01",sold:80},{date:"2000-01-02",sold:70}]},{candyName:"twix",data:[{date:"2000-01-01",sold:60},{date:"2000-01-02",sold:50}]},{candyName:"milkyway",data:[{date:"2000-01-01",sold:60},{date:"2000-01-02",sold:70}]},{candyName:"skittles",data:[{date:"2000-01-01",sold:120},{date:"2000-01-02",sold:110}]}];
console .log (
collectSales (candyDataSoldByEachDayInYear2000)
)
Это определенная очистка, позволяющая избежать некрасивых повторений.