You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在更新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;
});

关键说明

  1. 统一逻辑:不再区分是否已有测试结果,全部基于最新模板构建结果数组,确保结构与模板完全同步
  2. 数据匹配:通过标题匹配结果项、科目名称匹配具体科目,精准复用已有分数数据
  3. 自动适配:自动移除模板中不存在的旧科目,同时为新增科目填充默认0分
  4. 文件保留:保留原有的文件列表,避免模板更新导致已上传文件丢失

内容的提问来源于stack exchange,提问作者hoangnv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:30:59