这里我有一组对象。我希望每个等级作为独立的数组,在数组中,我想要基于等级的部分和主题。
如果老师正在上一个年级,我想要的图式是他们选的是哪个年级和哪个部分,里面是他们要选的科目。
var user = [
RowDataPacket { grade_id: 3, subject_id: 3, section_id: 747 },
RowDataPacket { grade_id: 4, subject_id: 3, section_id: 748 },
RowDataPacket { grade_id: 5, subject_id: 3, section_id: 749 },
RowDataPacket { grade_id: 6, subject_id: 3, section_id: 750 },
RowDataPacket { grade_id: 7, subject_id: 3, section_id: 751 },
RowDataPacket { grade_id: 8, subject_id: 3, section_id: 752 },
RowDataPacket { grade_id: 7, subject_id: 4, section_id: 751 }
]所需/目标模式
let gradeDetails = [{
grade_id: 3,
section_details: [{
section_id: 747,
subject_details: [{subject_id: 3}]
}]
}, {
.
.
.
}, {
grade_id: 7
section_details: [{
section_id: 751,
subject_details: [
{subject_id: 3},
{subject_id: 4}
]
}]
}, {
grade_id: 8,
section_details: [{
section_id: 752,
subject_details: [{subject_id: 3}]
]}
}];发布于 2022-02-05 14:48:01
下面的代码片段可能是实现所需结果的一种方法:
码样例
const getGradeDetailsArray = (arr = user) => {
const resultArr = [];
for (const grade of (new Set(arr.map(obj => obj.grade_id)))) {
const resObj = {
grade_id: grade,
section_details: arr.filter(
obj => obj.grade_id === grade
).map(
obj => ({
section_id: obj.section_id,
subject_details: [{ subject_id: obj.subject_id }]
})
)
};
resultArr.push(resObj)
};
return resultArr;
};解释
将结果初始化为一个名为resultArr
grade_id的空数组,使用new Set(),并为每个级别迭代每个级别的
grade_id的对象,将grade
section_details设置为经过匹配筛选的数组,grade_id
subect_details是一个具有确切元素的数组(即subject_id).
resultArr)。
代码片段
const user = [
{ grade_id: 3, subject_id: 3, section_id: 747 },
{ grade_id: 4, subject_id: 3, section_id: 748 },
{ grade_id: 5, subject_id: 3, section_id: 749 },
{ grade_id: 6, subject_id: 3, section_id: 750 },
{ grade_id: 7, subject_id: 3, section_id: 751 },
{ grade_id: 8, subject_id: 3, section_id: 752 },
{ grade_id: 7, subject_id: 4, section_id: 751 },
];
const getGradeDetailsArray = (arr = user) => {
const resultArr = [];
for (const grade of (new Set(arr.map(obj => obj.grade_id)))) {
const resObj = {
grade_id: grade,
section_details: arr.filter(
obj => obj.grade_id === grade
).map(
obj => ({
section_id: obj.section_id,
subject_details: [{ subject_id: obj.subject_id }]
})
)
};
resultArr.push(resObj)
};
return resultArr;
};
console.log(getGradeDetailsArray());
const newGetGradeDetails = (arr = user) => (
Object.entries(
arr.reduce((fin, itm) => ({
...fin,
[itm.grade_id]: {
...fin[itm.grade_id],
[itm.section_id]: {
...(fin && fin[itm.grade_id] && fin[itm.grade_id][itm.section_id]
? fin[itm.grade_id][itm.section_id]
: {}
),
subjects: [
...(fin && fin[itm.grade_id] &&
fin[itm.grade_id][itm.section_id] &&
fin[itm.grade_id][itm.section_id].subjects &&
Array.isArray(fin[itm.grade_id][itm.section_id].subjects)
? fin[itm.grade_id][itm.section_id].subjects
: []
),
itm.subject_id
]
}
}
}) ,{})
).map(([kg, vg]) => ({
grade_id: kg,
section_details: Object.entries(vg).map(([kse, vse]) => ({
section_id: kse,
subject_details: vse.subjects.map(su => ({
subject_id: su
}))
}))
}))
);
console.log('\n\tUpdated as per comments noted below\n\n', newGetGradeDetails());
编辑:添加了新的方法来解释在下面的注释中请求的更改。
https://stackoverflow.com/questions/70997579
复制相似问题