数组中对象属性的累计和

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)

如何实现只计算两个属性?我究竟做错了什么?提前致谢。

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}