如何将匹配的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
相关产品推荐
相关产品推荐

