Всем привет. У меня есть задача написать следующую функцию:
Данные, которые приходят на вход:
const array = [
{
'2021-07-01': {
'products': [1661.28, 229],
},
},
{
'2021-07-02': {
'fare': [66, 78],
'products': 218,
}
},
{
'2021-07-03': {
'fare': 78,
'products': 909.80,
}
},
{
'2021-07-05': {
'water': 840,
'products': 1021.61,
},
},
]
Данные, которые необходимо получить:
[
{ '2021-07-01': '1890.28' },
{ '2021-07-02': '362.00' },
{ '2021-07-03': '987.80' },
{ '2021-07-05': '1861.61' },
{ total: '5101.69' },
{ fare: '222.00', products: '4039.69', water: '840.00' }
]
Функция считает сумму за день, общую сумму, и общую сумму за каждую позицию. В целом, в условии никаких подвохов нет
Моё решение:
const array = [
{
'2021-07-01': {
'products': [1661.28, 229],
},
},
{
'2021-07-02': {
'fare': [66, 78],
'products': 218,
}
},
{
'2021-07-03': {
'fare': 78,
'products': 909.80,
}
},
{
'2021-07-05': {
'water': 840,
'products': 1021.61,
},
},
]
const calculate = array => {
const digits = 2;
let total = 0;
let object = {};
const output = array.reduce((accumulator, currentValue, index, array) => {
const prop = {};
const date = Object.keys(currentValue)[0];
for (const value of Object.keys(currentValue[date])) {
if (!object[value]) {
object[value] = 0;
}
object[value] += sum(currentValue[date][value]);
}
prop[date] = sum(Object.values(currentValue[date]).flat()).toFixed(digits);
total += sum(Object.values(currentValue[date]).flat());
accumulator.push(prop);
if (index === array.length - 1) {
accumulator.push({
total: total.toFixed(digits)
});
}
return accumulator;
}, []);
output.push(Object.keys(object).sort().reduce((accumulator, currentValue) => {
accumulator[currentValue] = object[currentValue].toFixed(digits);
return accumulator;
}, {}));
return output;
};
const sum = input => {
if (Array.isArray(input)) {
return input.reduce((accumulator, currentValue) => accumulator += currentValue, 0);
}
return input;
};
console.log(calculate(array));
Подскажите, как решение можно оптимизировать?