【问题标题】:Nested object reduce group by and sum - javascript [duplicate]嵌套对象减少分组和总和 - javascript [重复]
【发布时间】:2021-05-20 14:50:49
【问题描述】:

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

数据

"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;

【问题讨论】:

  • 您能补充一下您的预期结果吗?
  • { "name": "france Naicin", "avgTotalWeight": 36, "grade": { "grade1": 16, "grade2": 10, "grade3": 10 } }, { "name": "pacific gigas", "avgTotalWeight": 46, "grade": { "grade1": 16, "grade2": 10, "grade3": 20 } },
  • 对不起格式,但只是按名称、总权重和每个等级的总权重分组的不同名称下的总计
  • france NaicinavgTotalWeight36。难道不应该是58
  • 是的,很抱歉数据中有更多条目我刚刚舀了前几个对象,它应该只是总数,无论总数应该是多少!

标签: javascript json object nested reduce


【解决方案1】:

您可以使用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);

【讨论】:

  • 这是你想要的吗?
  • 添加weightTotal的同一个人和个人grade也。
  • 谢谢,这是一个开始,权重总结正确,但是成绩不正确,不知道为什么,那里有 2 级和 3 级,我只是得到 8000 1 级名字:/
  • 所以重量按名称分组正确,不幸的是,成绩是错误的
  • 成功了!!非常感谢我一定要研究它,所以我明白了,谢谢一百万我不知道如何支持你的答案!
猜你喜欢
  • 2020-09-18
  • 2019-07-26
  • 2020-05-22
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2021-04-02
相关资源
最近更新 更多