javascript 对数组中匹配相同键的所有项目求和

javascript Sum all item in array which match same key

我有一个 JSON 这样的:

  [
   {
      "faculty":{
         "_id":"5f9c3e04e5a5423cec34b2e2",
         "code":"khmt",
         "facultyName":"Computer Science"
      },
      "classSize":91,
      "warnedLength":61
   },
   {
      "faculty":{
         "_id":"5f9c53c8a0db8f4240ec6f71",
         "code":"dtvt",
         "facultyName":"Electronics and Telecommunication"
      },
      "classSize":89,
      "warnedLength":44
   },
   {
      "faculty":{
         "_id":"5f9c53c8a0db8f4240ec6f71",
         "code":"dtvt",
         "facultyName":"Electronics and Telecommunication"
      },
      "classSize":59,
      "warnedLength":20
   },
   {
      "faculty":{
         "_id":"5f9c53c8a0db8f4240ec6f71",
         "code":"hkvt",
         "facultyName":"Space Airline"
      },
      "classSize":10,
      "warnedLength":5
   },
   {
      "faculty":{
         "_id":"5f9c53c8a0db8f4240ec6f71",
         "code":"hkvt",
         "facultyName":"Space Airline"
      },
      "classSize":20,
      "warnedLength":10
   },
   {
      "faculty":{
         "_id":"5f9c53c8a0db8f4240ec6f71",
         "code":"hkvt",
         "facultyName":"Space Airline"
      },
      "classSize":30,
      "warnedLength":15
   }
]

我想要这样的输出:

[
   {
      "faculty":{
         "_id":"5f9c3e04e5a5423cec34b2e2",
         "code":"khmt",
         "facultyName":"Computer Science"
      },
      "totalClassSize":91,
      "totalWarnedLength":61
   },
   {
      "faculty":{
         "_id":"5f9c53c8a0db8f4240ec6f71",
         "code":"dtvt",
         "facultyName":"Electronics and Telecommunication"
      },
      "totalClassSize":148, // total classSize of all class has facultyName is "Electronics and Telecommunication"
      "totalWarnedLength":64 // total warnedLength of all class has facultyName is "Electronics and Telecommunication"
   },
   {
      "faculty":{
         "_id":"5f9c53c8a0db8f4240ec6de0",
         "code":"hkvt",
         "facultyName":"Space Airline"
      },
      "totalClassSize":60, // total classSize of all class has facultyName is "Space Airline"
      "totalWarnedLength":30 // total warnedLength of all class has facultyName is "Space Airline"
   },
]

输出是一个数组,它将所有 classSize 具有相同教员的人求和为 属性 totalClassSize 并将所有 warnedLength 具有相同教员的人求和为 属性 totalWarnedLength

输入是数组,输出也是数组

我是一个学习代码的初学者,我仍然被这个问题困扰了一段时间

非常感谢你帮助我,祝你有美好的一天

使用Array.prototype.reduce,您可以通过将当前输入数组按faculty._id分组作为对象键来生成新对象,并在此基础上计算totalWarnedLengthtotalClassSize 对于相同的对象键。

const input = [{
    "faculty": {
      "_id": "5f9c3e04e5a5423cec34b2e2",
      "code": "khmt",
      "facultyName": "Computer Science"
    },
    "classSize": 91,
    "warnedLength": 61
  },
  {
    "faculty": {
      "_id": "5f9c53c8a0db8f4240ec6f71",
      "code": "dtvt",
      "facultyName": "Electronics and Telecommunication"
    },
    "classSize": 89,
    "warnedLength": 44
  },
  {
    "faculty": {
      "_id": "5f9c53c8a0db8f4240ec6f71",
      "code": "dtvt",
      "facultyName": "Electronics and Telecommunication"
    },
    "classSize": 59,
    "warnedLength": 20
  },
  {
    "faculty": {
      "_id": "5f9c53c8a0db8f4240ec6f71",
      "code": "hkvt",
      "facultyName": "Space Airline"
    },
    "classSize": 10,
    "warnedLength": 5
  },
  {
    "faculty": {
      "_id": "5f9c53c8a0db8f4240ec6f71",
      "code": "hkvt",
      "facultyName": "Space Airline"
    },
    "classSize": 20,
    "warnedLength": 10
  },
  {
    "faculty": {
      "_id": "5f9c53c8a0db8f4240ec6f71",
      "code": "hkvt",
      "facultyName": "Space Airline"
    },
    "classSize": 30,
    "warnedLength": 15
  }
];

const groupBy = input.reduce((acc, cur) => {
  if (acc[cur.faculty['_id']]) {
    acc[cur.faculty['_id']].totalClassSize += cur.classSize;
    acc[cur.faculty['_id']].totalWarnedLength += cur.warnedLength;
  } else {
    acc[cur.faculty['_id']] = {
      faculty: cur.faculty,
      totalClassSize: cur.classSize,
      totalWarnedLength: cur.warnedLength
    };
  }
  return acc;
}, {});
const output = Object.values(groupBy);
console.log(output);