Мне нужна помощь с этим матричным алгоритмом:
Ввод:
const reqObj = [
['Anna', 'Class', 'Cycling', '10'],
['Anna', 'Class', 'Boxing', '25'],
['Anna', 'Class', 'Climbing', '20'],
['Anna', 'Misc', 'Towel', '5'],
['Anna', 'Drink', 'Coffee', '3'],
['Anna', 'Drink', 'Tea', '4'],
['Beatrice', 'Drink', 'Tea', '4'],
['Beatrice', 'Class', 'Kickboxing', '25'],
['Beatrice', 'Misc', 'Lock', '20'],
['Beatrice', 'Misc', 'Towel', '5']
]
Ожидаемый результат:
const resObj = [
['Anna', 'Class', 'Cycling', '10'],
['Anna', 'Class', 'Boxing', '25'],
['Anna', 'Class', 'Climbing', '20'],
['Anna', 'Misc', 'Towel', '5'],
['Anna', 'Drink', 'Coffee', '3'],
['Anna', 'Drink', 'Tea', '4'],
['Anna', 'Class', 'Total classes', '55'],
['Anna', 'Drink', 'Total drinks', '7'],
['Beatrice', 'Drink', 'Tea', '4'],
['Beatrice', 'Class', 'Kickboxing', '25'],
['Beatrice', 'Misc', 'Lock', '20'],
['Beatrice', 'Misc', 'Towel', '5'],
['Beatrice', 'Class', 'Total classes', '25'],
['Beatrice', 'Drink', 'Total drinks', '4']
]
В словах:
- Цикл по массиву объектов содержит данные нескольких человек.
- Если один и тот же человек, тот же сервис (не Misc), получает сумму из стоимость услуги , замените имя службы на полное имя и добавьте в конец строк данные этого человека.
Вот мой код:
const totalRow = arr => {
let result = [].concat(...arr.reduce((acc, [person, service, type, amount]) => {
let data = acc.get(person) || [[person, service, type, '0']]
if (service === 'Class') data.push([person, service, 'Total classes', amount])
else if (service === 'Drink') data.push([person, service, 'Total drinks', amount])
data[0][3] = (+data[0][3] + +amount).toString()
return acc.set(person, data)
}, new Map)
.values()
)
return result
}
const totalRowResult = totalRow(reqObj)
console.log(totalRowResult)
Обновление
Вывод с отрицательной суммой:
const resObj = [
['Anna', 'Class', 'Cycling', '10'],
['Anna', 'Class', 'Boxing', '25'],
['Anna', 'Class', 'Climbing', '20'],
['Anna', 'Misc', 'Towel', '5'],
['Anna', 'Drink', 'Coffee', '3'],
['Anna', 'Drink', 'Tea', '4'],
['Anna', 'Class', 'Total classes', '-55'],
['Anna', 'Drink', 'Total drinks', '-7'],
['Beatrice', 'Drink', 'Tea', '4'],
['Beatrice', 'Class', 'Kickboxing', '25'],
['Beatrice', 'Misc', 'Lock', '20'],
['Beatrice', 'Misc', 'Towel', '5'],
['Beatrice', 'Class', 'Total classes', '-25'],
['Beatrice', 'Drink', 'Total drinks', '-4']
]