如何为数组中单词添加连续答对计数器并三连答对时删除该单词?
嘿,这个需求其实很常见,咱们可以通过给每个单词对象加个连续答对计数器的属性来解决,完全不用反复复制数组,代码会简洁很多。我给你捋捋具体实现思路和代码示例:
核心思路
- 给每个单词对象新增一个
streak属性,初始值设为0,专门用来记录连续答对的次数。 - 用户作答后,根据对错更新对应单词的
streak:答对就+1,答错直接重置为0(因为连续答对的中断了)。 - 每次答对后检查
streak是否等于3,如果是,就把这个单词从数组里移除,这样后续就不会再出这个单词的题目了。
具体代码示例
假设你的原始单词数组是这样的:
let vocabulary = [ { word: "apple", translation: "苹果", definition: "一种常见的红色水果" }, { word: "banana", translation: "香蕉", definition: "长条形的黄色水果" }, { word: "orange", translation: "橙子", definition: "橙色的柑橘类水果" } ];
首先,给每个单词初始化streak属性(可以在数组创建时直接加,或者用循环批量添加):
// 批量添加streak属性 vocabulary.forEach(word => { word.streak = 0; });
然后是处理用户作答的函数,接收当前题目对应的单词和用户是否答对的状态:
function handleAnswer(targetWord, isCorrect) { // 找到数组中对应的单词对象 const wordIndex = vocabulary.findIndex(word => word.word === targetWord.word); if (wordIndex === -1) return; // 没找到的话直接返回 if (isCorrect) { // 答对了,连续次数+1 vocabulary[wordIndex].streak += 1; // 检查是否连续答对3次 if (vocabulary[wordIndex].streak === 3) { // 从数组中移除该单词,直接操作原数组,高效无冗余 vocabulary.splice(wordIndex, 1); console.log(`${targetWord.word} 已经连续答对3次,移除出题库!`); } } else { // 答错了,重置连续次数为0 vocabulary[wordIndex].streak = 0; } }
为什么这个方案更优?
- 无冗余数组操作:直接操作原数组的元素,用
splice移除达标单词,比反复复制数组节省内存和性能。 - 状态跟踪清晰:每个单词的连续答对状态存在自身对象里,逻辑一目了然,后续维护也方便。
- 可扩展性强:如果后续想调整连续答对的次数(比如改成5次),只需要修改判断条件里的数字就行,不用大改代码结构。
你可以这样模拟调用测试:
// 模拟连续答对apple三次 handleAnswer(vocabulary[0], true); // streak变成1 handleAnswer(vocabulary[0], true); // streak变成2 handleAnswer(vocabulary[0], true); // streak变成3,apple被移除 console.log(vocabulary); // 现在数组里只剩banana和orange了 // 模拟答对后答错的情况 handleAnswer(vocabulary[0], true); // streak=1 handleAnswer(vocabulary[0], false); // streak重置为0 handleAnswer(vocabulary[0], true); // streak变回1,不会触发移除
内容的提问来源于stack exchange,提问作者Dima M
相关产品推荐
相关产品推荐

