【问题标题】:Cumulative sum of object properties in array数组中对象属性的累积和
【发布时间】:2022-01-14 19:22:31
【问题描述】:

我有一个对象数组,我想用累积值更新这些对象中的两个属性。我们的想法是只累积计算两个属性(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)

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

【问题讨论】:

    标签: javascript arrays object ecmascript-6


    【解决方案1】:

    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)

    【讨论】:

    • 感谢您的努力,但这不是我需要的。我需要累积计算所有 eopAdvanceTickets,并且还需要累积计算所有 eopAdvanceRevenues。
    • @Milos 和所有对象都具有相同的属性和值?
    • 什么意思?
    • 你说I have an array of objects and I want to create new properties in those objects with cumulative values.我的意思是每个对象都应该有cumulativeEopAdvanceTicketscumulativeEopAdvanceRevenues
    • 我已经用预期的结果更新了我的问题。
    【解决方案2】:

    也许这就是你要找的东西?

    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)

    【讨论】:

    • 我已经用预期的结果更新了我的问题。
    【解决方案3】:

    另一种解决方案

    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}

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 2018-10-10
      • 2021-11-27
      • 2023-01-20
      • 2022-01-06
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      相关资源
      最近更新 更多