【问题标题】:How to most efficiently aggregate array of objects by ID?如何通过 ID 最有效地聚合对象数组?
【发布时间】:2020-11-29 16:25:58
【问题描述】:

我的起始数据集是一个包含指标的对象数组,每个对象都包含一个 ID。我需要按 ID 将此数据集转换为聚合数组。例如:

const startingArray = [
  { id: 1, metricA: 5, metricB: 8, metricC: 1 }
  { id: 2, metricA: 4, metricB: 0, metricC: 7 }
  { id: 1, metricA: 9, metricB: 8, metricC: 2 }
  { id: 3, metricA: 1, metricB: 8, metricC: 2 }
  { id: 3, metricA: 6, metricB: 6, metricC: 1 }
  { id: 2, metricA: 3, metricB: 1, metricC: 9 }
  { id: 1, metricA: 3, metricB: 9, metricC: 8 }
]

const aggregates = {};

startingArray.forEach((item) => {
  if (!aggregates[item.id]) {
    aggregates[item.id] = {
      id: item.id,
      metricA: item.metricA, 
      metricB: item.metricB, 
      metricC: item.metricC
    }
  } else {
    aggregates[item.id].metricA += item.metricA,
    aggregates[item.id].metricB += item.metricB,
    aggregates[item.id].metricC += item.metricC
  }
});

// convert to flat array using lodash toArray() method
const endingArray = toArray(aggregates);

// results:
// [
//   { id: 1, metricA: 17, metricB: 25, metricC: 11 }
//   { id: 2, metricA: 5, metricB: 1, metricC: 16 }
//   { id: 3, metricA: 5, metricB: 8, metricC: 3 }
// ]

数组可能很大,处理这个数据集最有效的方法是什么?

【问题讨论】:

  • inendingArray id:2 对 metricB 有误导性的值,它应该是 1 或者 startArray 的值可能错误......请检查值并在遇到问题的地方分享您的代码。
  • 你说得对,我用正确的值更新了问题。

标签: javascript node.js algorithm


【解决方案1】:

您可以从对象中解构id 并收集其余部分以获取所有条目并创建一个新对象并汇总所有其余属性。

const
    data = [{ id: 1, metricA: 5, metricB: 8, metricC: 1 }, { id: 2, metricA: 4, metricB: 0, metricC: 7 }, { id: 1, metricA: 9, metricB: 8, metricC: 2 }, { id: 3, metricA: 1, metricB: 8, metricC: 2 }, { id: 3, metricA: 6, metricB: 6, metricC: 1 }, { id: 2, metricA: 3, metricB: 1, metricC: 9 }, { id: 1, metricA: 3, metricB: 9, metricC: 8 }],
    result = Object.values(data.reduce((r, { id, ...o }) => {
        Object.entries(o).forEach(([k, v]) => {
            r[id] ??= { id };
            r[id][k] = (r[id][k] || 0) + v;
        });
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-06
    • 2019-08-31
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2020-08-16
    相关资源
    最近更新 更多