嵌套对象减少分组依据和求和 - 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);
我有一个包含数据的 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);