数组中对象属性的累计和
Cumulative sum of object properties in array
我有一个对象数组,我想用累积值更新这些对象中的两个属性。我的想法是仅累积计算两个属性(eopAdvanceTickets
和 eopAdvanceRevenue
),但我不是这样,而是累积计算所有值。
预期的结果应该是这样的:
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)
如何实现只计算两个属性?我究竟做错了什么?提前致谢。
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)
也许这就是您要找的东西?
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)
另一种解决方案
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}
我有一个对象数组,我想用累积值更新这些对象中的两个属性。我的想法是仅累积计算两个属性(eopAdvanceTickets
和 eopAdvanceRevenue
),但我不是这样,而是累积计算所有值。
预期的结果应该是这样的:
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)
如何实现只计算两个属性?我究竟做错了什么?提前致谢。
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)
也许这就是您要找的东西?
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)
另一种解决方案
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}