[英]Creating an array of object with cumulative sum dynamically in javascript
[英]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)
我怎樣才能實現只計算兩個屬性? 我究竟做錯了什么? 提前致謝。
如果您只想添加一個屬性,您可以輕松地 map 在您的數組上,並使用object-destructuring
語法向先前的對象添加新屬性,如下所示:
const arrWithCumulativeValue = arr.map(obj =>({...obj, cumulativeValue: obj.eopAdvanceTickets + obj.eopAdvanceRevenue }))
也許這就是你要找的?
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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.