如何在更新result_template时合并含分数的subjects数组
问题描述
初始状态下用户未输入测试结果时,数组result = null;用户输入后数组会有对应内容。当前需求:用户输入测试结果后,若更新result_template字段导致subjects增删,需合并subjects数据——新增的subjects若无可用分数,默认设为0。
预期效果:
现有代码
const { data } = await this.$store.dispatch( `${UserGeneral.STORE_ADMIN_USER_KEY}/getDetailSchoolResults`, this.$route.params.id ); const formData = data.data; if (formData.result) { const listResultTemplate = formData.result.result.map((item) => { let data = { title: item.title, subjects: [], files: [], }; item.files.forEach((file) => { data.files.push(file); }); item.subjects.forEach((subject) => { data.subjects.push({ name: subject.name, scores: { total_score: subject.scores.total_score, medium_score: subject.scores.medium_score, private_score: subject.scores.private_score, }, }); }); return data; }); this.result = listResultTemplate; } else { const listResultTemplate = formData.result_template.result_template.map( (item) => { let data = { title: item.title, subjects: [], files: [], }; item.subjects.forEach((subject) => { data.subjects.push({ name: subject, scores: { total_score: 0, medium_score: 0, private_score: 0, }, }); }); return data; } ); this.result = listResultTemplate; }
解决方案
核心逻辑:以更新后的result_template的科目列表为基准,与已有测试结果中的科目匹配合并,保留原有有效数据,新增科目默认赋0分,移除模板中已删除的科目。
修改后的代码:
const { data } = await this.$store.dispatch( `${UserGeneral.STORE_ADMIN_USER_KEY}/getDetailSchoolResults`, this.$route.params.id ); const formData = data.data; // 统一基于模板构建结果,自动合并已有数据 this.result = formData.result_template.result_template.map(templateItem => { // 找到对应已存在的测试结果项 const existingItem = formData.result?.result?.find(item => item.title === templateItem.title); const resultItem = { title: templateItem.title, subjects: [], files: [...(existingItem?.files || [])] // 保留已上传文件 }; // 遍历模板科目,合并已有数据 templateItem.subjects.forEach(templateSubject => { const existingSubject = existingItem?.subjects?.find(subj => subj.name === templateSubject); if (existingSubject) { // 保留原有分数 resultItem.subjects.push({ name: existingSubject.name, scores: { total_score: existingSubject.scores.total_score, medium_score: existingSubject.scores.medium_score, private_score: existingSubject.scores.private_score, } }); } else { // 新增科目默认0分 resultItem.subjects.push({ name: templateSubject, scores: { total_score: 0, medium_score: 0, private_score: 0, } }); } }); return resultItem; });
关键说明
- 统一逻辑:不再区分是否已有测试结果,全部基于最新模板构建结果数组,确保结构与模板完全同步
- 数据匹配:通过标题匹配结果项、科目名称匹配具体科目,精准复用已有分数数据
- 自动适配:自动移除模板中不存在的旧科目,同时为新增科目填充默认0分
- 文件保留:保留原有的文件列表,避免模板更新导致已上传文件丢失
内容的提问来源于stack exchange,提问作者hoangnv
相关产品推荐
相关产品推荐

