JavaScript遍历数组按条件删除:查词无释义时删除的问题排查
代码问题排查:遍历单词数组并移除无释义单词
第一段代码的问题
这段代码完全没有执行效果,核心问题如下:
Meaning函数内部定义了getMeaning异步函数,但从未调用它,整个逻辑根本没启动。- 调用
fetch时把整个words数组拼进URL,API只接收单个单词,导致请求地址格式错误,返回内容完全不符合预期。 - 循环里操作的是
myJson而非原words数组,就算逻辑正确,也不会修改目标数组。 - 未处理请求错误,比如API返回404时,
response.json()会抛出异常,直接中断代码执行。 - 循环变量
i未用let/const声明,会变成全局变量,引发潜在的作用域冲突。
第二段代码的问题
这段代码能捕获404但无法删除单词,问题出在这些细节:
- 判断404的方式错误:
fetch返回的是Response对象,要判断状态码得用response.status === 404,直接拿response和404对比永远不成立。 - 删除数组元素的代码写错:
words[i].splice(i,1)里的words[i]是单个字符串,字符串没有splice方法,正确写法是words.splice(i, 1);而且删除元素后数组长度变短,需要手动把i--,否则会跳过下一个单词。 - 异步操作和同步循环冲突:
for循环会快速跑完,此时i已经等于数组长度,异步回调触发时用i会导致索引越界。 - 逻辑流程错误:第一个
then里直接throw new Error,不管请求成功与否都会进入catch,正常的成功响应也被当成错误处理。 - 循环变量
i未声明为局部变量,全局变量会被所有异步回调共享,导致索引混乱。
正确实现示例
可以用Promise.all结合过滤的方式实现,逻辑清晰且避免异步同步冲突:
const words = ["word1", "word2", "word3"]; async function filterValidWords(wordList) { // 遍历每个单词,生成验证Promise const validationTasks = wordList.map(async (word) => { try { const response = await fetch(`https://api.dictionaryapi.dev/api/v2/entries/en/${word}`); // 状态码200-299视为有效单词,否则返回null return response.ok ? word : null; } catch (err) { // 网络错误等异常情况也视为无效单词 return null; } }); // 等待所有请求完成,过滤掉无效的null值 const validWords = (await Promise.all(validationTasks)).filter(word => word !== null); console.log(validWords); return validWords; } // 执行函数 filterValidWords(words);
内容的提问来源于stack exchange,提问作者kip
相关产品推荐
相关产品推荐

