Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何按ID最有效地聚合对象数组?_Javascript_Node.js_Algorithm - Fatal编程技术网

Javascript 如何按ID最有效地聚合对象数组?

Javascript 如何按ID最有效地聚合对象数组?,javascript,node.js,algorithm,Javascript,Node.js,Algorithm,我的起始数据集是一个包含度量的对象数组,每个对象都包含一个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, metr

我的起始数据集是一个包含度量的对象数组,每个对象都包含一个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 }
// ]
数组可能非常庞大,处理此数据集的最有效方法是什么?

您可以从对象中分解id,收集其余的id以获取所有条目,并创建一个新对象和所有rest属性的总和

常数 数据=[{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,metricA:1,{id:2,metricA:3,metricA:1,metricA:9,metricA:9},metricA:8},metricA:8], 结果=Object.valuesdata.reducer,{id,…o}=>{ Object.entrieso.forEach[k,v]=>{ r[id]??={id}; r[id][k]=r[id][k]| | 0+v; }; 返回r; }, {}; console.logresult;
.由于endingArray id:2中的控制台包装{max height:100%!important;top:0;}对metricB有误导性的值,它应该是1,或者可能startingArray有错误的值……。请检查该值,并在出现问题的地方共享代码。如果您是正确的,我用正确的值更新了该问题。