簡體   English   中英

數組中 object 屬性的累積和

[英]Cumulative sum of object properties in array

我有一個對象數組,我想用累積值更新這些對象中的兩個屬性。 這個想法是僅累積計算兩個屬性( eopAdvanceTicketseopAdvanceRevenue ),但不是那樣,而是累積計算所有值。

預期的結果應該是這樣的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM