JavaScript 对象的总和值

Sum values of a JavaScript object

给定一个这种结构的对象

{
    "1": {
        "data": {
            "a": 100,
            "z": 100,
            "e": 50
        },
        "percentage": {
            "a": 10,
            "z": 10,
            "e": 41.09
        }
    },
    "2": {
        "data": {
            "a": 10,
            "z": 10,
            "e": 20
        },
        "percentage": {
            "a": 30,
            "z": 40,
            "e": 50
        }
    }
}

我想对这个对象的值求和以获得这个相似的结构

{
    "data": {
        "a": sum(a),
        "z": sum(z),
        "e": sum(e)
    },
    "percentage": {
        "a": sum(a)/numberOfelements,
        "z": sum(z)/numberOfelements,
        "e": sum(e)/numberOfelements
    }
}

因为我刚开始学习 js,我发现很难在这个映射中实现求和

Object.keys(filtered).map(key => ({
        data: data[key].data,
        percentage: data[key].percentage,
      }))

如有任何帮助,我们将不胜感激

如果 numOfElements 表示数据对象中的元素,则当前实现即可。否则取消注释现有的注释行,并注释最后一个注释行之后的行。其中考虑了数据对象中的元素。

const obj = {
  1: {
    data: {
      a: 100,
      z: 100,
      e: 50,
    },
  },
  2: {
    data: {
      a: 10,
      z: 10,
      e: 20,
    },
  },
};
function groupBySum(obj) {
  let data = {};
  let percentage = {};
  // let numberOfElements = 0;
  for (let i in obj) {
    // numberOfElements += 1;
    for (let j in obj[i].data) {
      if (data[j] === undefined) {
        data[j] = obj[i].data[j];
      } else {
        data[j] += obj[i].data[j];
      }
    }
  }
  for (let i in data) {
    // percentage[i] = data[i] / numberOfElements;
    percentage[i] = data[i] / Object.keys(data).length;
  }
  return {
    data,
    percentage,
  };
}
console.log(groupBySum(obj));

此外,将您当前的结构更改为数组格式也是个好主意,如下所示。

const obj = [
  {
    data: {
      a: 100,
      z: 100,
      e: 50,
    },
    percentage: {
      a: 10,
      z: 10,
      e: 41.09,
    },
  },
  {
    data: {
      a: 10,
      z: 10,
      e: 20,
    },
    percentage: {
      a: 30,
      z: 40,
      e: 50,
    },
  },
];