嵌套对象减少分组依据和求和 - javascript

Nested object reduce group by and sum - javascript

我有一个包含数据的 json 对象,我需要按名称对这些对象进行分组,按名称对权重求和,然后对成绩求和。我已经尝试了 2 天了。它应该看起来像 {name,weightTotal,grade{grade1total:, grade2total, grade2total}}...我查看了大约 30 个堆栈 qs 并尝试减少和 foreach groupby 但我不明白任何一个,我是第三个一年级学生做我的第一次实习。需要这个在前端进行以将它们显示为 table。这些来自休息端点顺便说一句。

数据

"data": [
    {
      name: "france Naicin",
      avgTotalWeight: 16,
      grade: {
        grade1: 16,
        grade2: 0,
        grade3: 0,
      },
    },
    {
      name: "pacific gigas",
      avgTotalWeight: 16,
      grade: {
        grade1: 16,
        grade2: 0,
        grade3: 0,
      },
    },
    {
      name: "france Naicin",
      avgTotalWeight: 13,
      grade: {
        grade1: 13,
        grade2: 0,
        grade3: 0,
      },
    },
    {
      name: "france Naicin",
      avgTotalWeight: 14,
      grade: {
        grade1: 14,
        grade2: 0,
        grade3: 0,
      },
    },
    {
      name: "france Naicin",
      avgTotalWeight: 15,
      grade: {
        grade1: 15,
        grade2: 0,
        grade3: 0,
      },
    },
  ],

我得到这个的代码json:

let a = [];

    for (let i = 0; i <= data.length; i++) {
      if (!data[i]) {
        continue;
      }

      const {avgTotalWeight} = data[i];
      const {name} = data[i].truerun.batch.shellfish;
      const {alias} = data[i].truerun.grade_list;
      const {updatedAt} = data[i];
      const {isExist} = data[i].truerun;

      if (avgTotalWeight !== null) {
        let grade1,
          grade2,
          grade3 = 0;

        if (alias === "G1") {
          grade1 = avgTotalWeight;
        } else grade1 = 0;

        if (alias === "G2") {
          grade2 = avgTotalWeight;
        } else grade2 = 0;

        if (alias === "G3") {
          grade3 = avgTotalWeight;
        } else grade3 = 0;

        let b = {
          name: name,
          avgTotalWeight: avgTotalWeight,
          //updatedAt: updatedAt,
          //isExist: isExist,
          grade: {
            grade1: grade1,
            grade2: grade2,
            grade3: grade3,
          },
        };

        a.push(b);
      }
    }

    return a;

您可以使用 reduce

轻松实现此结果

如果某些情况 grade 键增加,那么您可以添加动态代码,以便它可以与 grade 中的无限键一起使用。只需更换

isExist.grade.grade1 += grade.grade1;
isExist.grade.grade2 += grade.grade2;
isExist.grade.grade3 += grade.grade3;

Object.keys(isExist.grade).forEach((key) => {
  isExist.grade[key] += curr.grade[key];
});

const obj = {
  data: [
    {
      name: "france Naicin",
      avgTotalWeight: 16,
      grade: {
        grade1: 16,
        grade2: 0,
        grade3: 0,
      },
    },
    {
      name: "pacific gigas",
      avgTotalWeight: 16,
      grade: {
        grade1: 16,
        grade2: 0,
        grade3: 0,
      },
    },
    {
      name: "france Naicin",
      avgTotalWeight: 13,
      grade: {
        grade1: 13,
        grade2: 0,
        grade3: 0,
      },
    },
    {
      name: "france Naicin",
      avgTotalWeight: 14,
      grade: {
        grade1: 14,
        grade2: 0,
        grade3: 0,
      },
    },
    {
      name: "france Naicin",
      avgTotalWeight: 15,
      grade: {
        grade1: 15,
        grade2: 0,
        grade3: 0,
      },
    },
  ],
};

const result = obj.data.reduce((acc, curr) => {
  const { name, avgTotalWeight, grade } = curr;
  const isExist = acc.find((o) => o.name === name);
  if (isExist) {
    isExist.weightTotal += avgTotalWeight;
    isExist.grade.grade1 += grade.grade1;
    isExist.grade.grade2 += grade.grade2;
    isExist.grade.grade3 += grade.grade3;
  } else {
    acc.push({
      name,
      weightTotal: avgTotalWeight,
      grade,
    });
  }
  return acc;
}, []);

console.log(result);