array.find()始终返回同一数组问题 - JS/jQuery测验开发
解决你的JS测验程序
find()返回重复结果问题 嘿,我懂你现在的困扰——写测验程序时明明已经过滤出未作答的问题数组,可每次用array.find()都拿到同一个结果,对吧?咱们一步步来排查和解决:
先搞清楚array.find()的本质
首先得明确:find()方法的作用是返回数组中第一个满足你给定条件的元素,找到匹配项后就会立刻停止遍历,不会继续找后面的。所以它每次返回同一个元素,大概率是因为你的未作答数组里,这个元素一直是第一个符合条件的,或者数组的状态根本没更新。
排查核心问题点
1. 未作答数组的过滤逻辑是否实时更新?
你是不是只在初始化的时候生成了一次unansweredArr?比如这种错误写法:
// 只执行一次,后续不会自动更新 const allQuestions = [/* 你的10个问题对象 */]; const unansweredArr = allQuestions.filter(q => !q.isAnswered);
如果是这样,那unansweredArr永远是初始状态的未作答数组,哪怕用户答了题,这个数组也不会同步变化。正确的做法是每次需要获取未作答问题时,都从原数组重新过滤:
// 封装成函数,每次调用都返回最新的未作答数组 function getUnansweredQuestions() { return allQuestions.filter(q => !q.isAnswered); }
2. 作答后是否正确更新了isAnswered属性?
用户完成一道题后,你必须把对应问题对象的isAnswered设为true,否则原数组里的状态没变化,过滤出来的unansweredArr还是会包含那个已作答的问题。比如用户答完当前题后:
// 假设你已经拿到了当前作答的问题对象currentQuestion currentQuestion.isAnswered = true;
这里要注意:因为数组是引用类型,如果你修改的是unansweredArr里的元素,也会同步到原数组allQuestions,但还是建议直接操作原数组,逻辑会更清晰。
3. 是不是需要随机获取未作答问题?
如果你的需求是每次拿一个不同的未作答问题,那find()其实不适合,因为它只会拿第一个匹配项。这种情况可以用随机索引来取:
const unansweredArr = getUnansweredQuestions(); if (unansweredArr.length > 0) { // 生成0到数组长度-1的随机索引 const randomIdx = Math.floor(Math.random() * unansweredArr.length); const targetQuestion = unansweredArr[randomIdx]; // 接下来处理这个随机选中的问题 }
总结一下
- 确保每次获取未作答数组时,都从原数组重新过滤,不要用缓存的旧数组
- 用户作答后,一定要更新对应问题的
isAnswered状态为true - 如果需要随机出题,用随机索引代替
find()
这样应该就能解决你遇到的问题啦~
内容的提问来源于stack exchange,提问作者Aequivalent
相关产品推荐
相关产品推荐

