I have an array of objects and I want to update two properties in those objects with cumulative values. The idea is to calculate only two properties cumulatively (eopAdvanceTickets and eopAdvanceRevenue), but instead of that, I'm getting all values calculated cumulatively.
The expected result should be like this:
const arr = [
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 0,
"playedOffRevenue": 0,
"advanceTickets": 11407,
"advanceRevenue": 284222.5,
"occurredAt": "",
"changeInPeriodTickets": 0,
"changeInPeriodRevenue": 0,
"eopAdvanceTickets": 11407,
"eopAdvanceRevenue": 284222.5
},
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 112,
"playedOffRevenue": 3151.5,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-14T00:00:00.000",
"changeInPeriodTickets": -112,
"changeInPeriodRevenue": -3151.5,
"eopAdvanceTickets": 11295,
"eopAdvanceRevenue": 281071
},
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 392,
"playedOffRevenue": 13592,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-09T00:00:00.000",
"changeInPeriodTickets": -392,
"changeInPeriodRevenue": -13592,
"eopAdvanceTickets": 10903,
"eopAdvanceRevenue": 267479
},
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 502,
"playedOffRevenue": 18415.5,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-08T00:00:00.000",
"changeInPeriodTickets": -502,
"changeInPeriodRevenue": -18415.5,
"eopAdvanceTickets": 10401,
"eopAdvanceRevenue": 249063.5
}
];
const arr = [
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 0,
"playedOffRevenue": 0,
"advanceTickets": 11407,
"advanceRevenue": 284222.5,
"occurredAt": "",
"changeInPeriodTickets": 0,
"changeInPeriodRevenue": 0,
"eopAdvanceTickets": 11407,
"eopAdvanceRevenue": 284222.5
},
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 112,
"playedOffRevenue": 3151.5,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-14T00:00:00.000",
"changeInPeriodTickets": -112,
"changeInPeriodRevenue": -3151.5,
"eopAdvanceTickets": -112,
"eopAdvanceRevenue": -3151.5
},
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 392,
"playedOffRevenue": 13592,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-09T00:00:00.000",
"changeInPeriodTickets": -392,
"changeInPeriodRevenue": -13592,
"eopAdvanceTickets": -392,
"eopAdvanceRevenue": -13592
},
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 502,
"playedOffRevenue": 18415.5,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-08T00:00:00.000",
"changeInPeriodTickets": -502,
"changeInPeriodRevenue": -18415.5,
"eopAdvanceTickets": -502,
"eopAdvanceRevenue": -18415.5
}
];
const totals = {} // store running totals in here
const cumulatedArr = arr.map(({ occurredAt, ...props }) => ({
occurredAt,
...Object.fromEntries(Object.entries(props).map(([ key, val ]) => [
key,
totals[key] = (totals[key] ?? 0) val // value is the result of the assignment
]))
}))
console.log(cumulatedArr)
How can I achieve to calculate only two properties? What am I doing wrong? Thanks in advance.
CodePudding user response:
const arr = [{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 0,
"playedOffRevenue": 0,
"advanceTickets": 11407,
"advanceRevenue": 284222.5,
"occurredAt": "",
"changeInPeriodTickets": 0,
"changeInPeriodRevenue": 0,
"eopAdvanceTickets": 11407,
"eopAdvanceRevenue": 284222.5
}, {
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 112,
"playedOffRevenue": 3151.5,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-14T00:00:00.000",
"changeInPeriodTickets": -112,
"changeInPeriodRevenue": -3151.5,
"eopAdvanceTickets": -112,
"eopAdvanceRevenue": -3151.5
}, {
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 392,
"playedOffRevenue": 13592,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-09T00:00:00.000",
"changeInPeriodTickets": -392,
"changeInPeriodRevenue": -13592,
"eopAdvanceTickets": -392,
"eopAdvanceRevenue": -13592
}, {
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 502,
"playedOffRevenue": 18415.5,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-08T00:00:00.000",
"changeInPeriodTickets": -502,
"changeInPeriodRevenue": -18415.5,
"eopAdvanceTickets": -502,
"eopAdvanceRevenue": -18415.5
}];
const result = arr.map((obj, index, self) => {
if (index == 0) return obj;
const prevO = self[index - 1]
obj.eopAdvanceTickets = prevO.eopAdvanceTickets;
obj.eopAdvanceRevenue = prevO.eopAdvanceRevenue;
return obj
});
console.log(result)
CodePudding user response:
Maybe this is what you were looking for?
const arr = [
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 502,
"playedOffRevenue": 18415.5,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-08T00:00:00.000",
"changeInPeriodTickets": -502,
"changeInPeriodRevenue": -18415.5,
"eopAdvanceTickets": -502,
"eopAdvanceRevenue": -18415.5
},
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 392,
"playedOffRevenue": 13592,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-09T00:00:00.000",
"changeInPeriodTickets": -392,
"changeInPeriodRevenue": -13592,
"eopAdvanceTickets": -392,
"eopAdvanceRevenue": -13592
},
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 112,
"playedOffRevenue": 3151.5,
"advanceTickets": 0,
"advanceRevenue": 0,
"occurredAt": "2022-01-14T00:00:00.000",
"changeInPeriodTickets": -112,
"changeInPeriodRevenue": -3151.5,
"eopAdvanceTickets": -112,
"eopAdvanceRevenue": -3151.5
},
{
"soldTickets": 0,
"soldRevenue": 0,
"playedOffTickets": 0,
"playedOffRevenue": 0,
"advanceTickets": 11407,
"advanceRevenue": 284222.5,
"occurredAt": "",
"changeInPeriodTickets": 0,
"changeInPeriodRevenue": 0,
"eopAdvanceTickets": 11407,
"eopAdvanceRevenue": 284222.5
}
];
const sums = {eopAdvanceTickets:0, eopAdvanceRevenue:0};
arr.forEach(c=>{for (p in sums) sums[p] =c[p]})
console.log(sums)
CodePudding user response:
Another one solution
const arr = [
{"soldTickets": 0,"soldRevenue": 0,"playedOffTickets": 0,"playedOffRevenue": 0,"advanceTickets": 11407,"advanceRevenue": 284222.5,"occurredAt": "","changeInPeriodTickets": 0,"changeInPeriodRevenue": 0,"eopAdvanceTickets": 11407,"eopAdvanceRevenue": 284222.5},
{"soldTickets": 0,"soldRevenue": 0,"playedOffTickets": 112,"playedOffRevenue": 3151.5,"advanceTickets": 0,"advanceRevenue": 0,"occurredAt": "2022-01-14T00:00:00.000","changeInPeriodTickets": -112,"changeInPeriodRevenue": -3151.5,"eopAdvanceTickets": -112,"eopAdvanceRevenue": -3151.5},
{"soldTickets": 0,"soldRevenue": 0,"playedOffTickets": 392,"playedOffRevenue": 13592,"advanceTickets": 0,"advanceRevenue": 0,"occurredAt": "2022-01-09T00:00:00.000","changeInPeriodTickets": -392,"changeInPeriodRevenue": -13592,"eopAdvanceTickets": -392,"eopAdvanceRevenue": -13592},
{"soldTickets": 0,"soldRevenue": 0,"playedOffTickets": 502,"playedOffRevenue": 18415.5,"advanceTickets": 0,"advanceRevenue": 0,"occurredAt": "2022-01-08T00:00:00.000","changeInPeriodTickets": -502,"changeInPeriodRevenue": -18415.5,"eopAdvanceTickets": -502,"eopAdvanceRevenue": -18415.5}];
const [initial, ...tail] = arr;
const result = tail.reduce((acc, obj) => {
const
eopAdvanceTickets = acc.at(-1).eopAdvanceTickets obj.eopAdvanceTickets,
eopAdvanceRevenue = acc.at(-1).eopAdvanceRevenue obj.eopAdvanceRevenue,
newObj = { ...obj, eopAdvanceTickets, eopAdvanceRevenue };
return [...acc, newObj]
}, [initial]);
console.log(result);
.as-console-wrapper {max-height: 100% !important; top: 0}
