如何按lessonid与sequence过滤字典列表,获取对应exerciseModelData及结果索引
如何按lessonid与sequence过滤字典列表,获取对应exerciseModelData及结果索引
针对你的需求,我来给你一步步说明实现方法,结合你提供的示例数据来讲解:
首先先看你给出的简化版示例数据结构:
const exercises = [ { "exerciseid": 3, "sequence": 1, "lessonid": 1, // ...其他属性 "exerciseModelData": [] }, { "exerciseid": 4, "sequence": 2, "lessonid": 1, // ...其他属性 "exerciseModelData": [] }, // ...更多项 ];
1. 过滤获取对应的exerciseModelData
要筛选出lessonid = 1且sequence = 2的项,并提取它的exerciseModelData,可以用数组的filter()方法:
// 设定你要匹配的条件 const targetLessonId = 1; const targetSequence = 2; // 过滤出符合条件的练习项 const matchedItem = exercises.filter(item => item.lessonid === targetLessonId && item.sequence === targetSequence )[0]; // 因为同一个lessonid下sequence应该是唯一的,所以取第一个结果 if (matchedItem) { const targetData = matchedItem.exerciseModelData; console.log("找到的exerciseModelData:", targetData); } else { console.log("没有找到符合条件的练习项"); }
如果你确定只会有一个匹配项,也可以用find()方法,它会直接返回第一个满足条件的元素,不用再手动取索引:
const matchedItem = exercises.find(item => item.lessonid === targetLessonId && item.sequence === targetSequence );
2. 获取匹配项在原数组中的索引
关于获取索引,你自己摸索出的方法是可行的,不过我可以给你一个更简洁高效的写法——用findIndex()方法一步到位:
const targetIndex = exercises.findIndex(item => item.lessonid === targetLessonId && item.sequence === targetSequence ); if (targetIndex !== -1) { console.log("匹配项的索引:", targetIndex); // 同时也能直接拿到对应的exerciseModelData const targetData = exercises[targetIndex].exerciseModelData; } else { console.log("未找到符合条件的项"); }
对你自己的代码提个小优化点:
// 你的原代码 exercise_result = exercises.filter(e => e.lessonid == selectedLessonId && e.sequence == currentLessonSequence); exercises_values = Object.values(exercises); sequence = exercises_values.indexOf(exercise_result[0]);
这里Object.values(exercises)完全没必要,因为exercises本身就是数组,直接用exercises.indexOf(exercise_result[0])就可以了。不过还是更推荐用findIndex(),它是基于条件直接查找索引,不需要先过滤出对象再找位置,逻辑更清晰,性能也更优~
备注:内容来源于stack exchange,提问作者Lawrence DeSouza
相关产品推荐
相关产品推荐

