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

如何将匹配的Learners Answered Questions数组附加到Module(支持乱序)

解决Module与Learners答题数据的乱序匹配问题

我来帮你搞定这个匹配问题!首先明确核心需求:我们要把Learners Answered Questions(laq)的嵌套数组,根据问题文本(text属性)的匹配(支持乱序),对应附加到Modules数组里的每个Module对象的quiz属性中。

先上示例数据,方便理解场景

先给你准备一组贴近实际的示例数据,这样更容易看明白逻辑:

Modules数组示例

const Modules = [
  {
    id: 1,
    name: "JavaScript基础",
    quiz: {
      questions: [
        { text: "什么是闭包?", id: "q1" },
        { text: "let和var的区别?", id: "q2" }
      ]
    }
  },
  {
    id: 2,
    name: "CSS布局",
    quiz: {
      questions: [
        { text: "Flex布局的主轴方向默认是?", id: "q3" },
        { text: "如何实现两栏自适应布局?", id: "q4" }
      ]
    }
  }
];

laq(Learners Answered Questions)数组示例(嵌套结构)

const laq = [
  // 对应Module 1的答题数据(问题顺序和Module里的不一样)
  [
    { questionText: "let和var的区别?", answers: ["作用域不同", "变量提升差异"] },
    { questionText: "什么是闭包?", answers: ["函数嵌套函数,内部函数访问外部变量"] }
  ],
  // 对应Module 2的答题数据(同样乱序)
  [
    { questionText: "如何实现两栏自适应布局?", answers: ["Flex", "Grid"] },
    { questionText: "Flex布局的主轴方向默认是?", answers: ["水平方向"] }
  ]
];

现有代码容易踩的坑

你之前的代码没法正常运行,大概率是踩了这些坑:

  • 直接按数组索引硬匹配,完全没考虑乱序的情况
  • 对比问题文本的逻辑写得有问题,比如没处理大小写差异,或者没精准匹配文本内容
  • 没有正确把laq数据附加到Module的quiz属性里,可能直接修改了原数组导致副作用

修正后的解决方案代码

我给你写了一套能支持乱序匹配的代码,核心思路是用集合快速查找问题文本,再验证laq分组是否完全匹配当前Module的所有问题:

// 核心匹配函数:把laq数据对应附加到Modules中
const matchModulesWithLearnerAnswers = (modules, learnerAnswers) => {
  return modules.map(module => {
    // 把当前Module的所有问题文本存入Set,方便快速查找
    const moduleQuestionTexts = new Set(
      module.quiz.questions.map(question => question.text)
    );

    // 找到匹配的laq分组:该分组里的所有问题文本都在当前Module的问题集合中
    const matchedAnswers = learnerAnswers.find(answerGroup => {
      return answerGroup.every(item => moduleQuestionTexts.has(item.questionText));
    });

    // 返回新的Module对象(不修改原数据,避免副作用)
    return {
      ...module,
      quiz: {
        ...module.quiz,
        learnerAnswers: matchedAnswers || [] // 没匹配到就返回空数组,避免undefined
      }
    };
  });
};

// 调用函数,得到处理后的Modules数组
const updatedModules = matchModulesWithLearnerAnswers(Modules, laq);
console.log(updatedModules);

代码细节说明

  • 用Set存问题文本是为了快速查找,比数组的includes效率高很多,数据量大的时候优势更明显
  • answerGroup.every(...)确保整个laq分组的问题都属于当前Module,不管内部顺序如何
  • 用扩展运算符(...)创建新对象,不会修改原数组和原对象,保持数据的不可变性,这是前端开发的最佳实践之一
  • 如果某个Module找不到对应的laq数据,默认给个空数组,避免后续使用时出现undefined报错

验证效果

运行代码后,你会看到每个Module的quiz属性里多了一个learnerAnswers字段,里面就是对应匹配的laq数据,哪怕laq里的问题顺序和Module里的questions顺序完全不一样,也能精准匹配上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:03:58