JavaScript问题:无法获取数组索引0的元素如何解决?
问题修复方案
你的代码核心问题是循环中只要遇到不匹配的元素就立刻触发错误,导致当目标元素是数组第一个元素(索引0)时,循环会继续遍历后续元素,一旦遇到不匹配的就触发"No match found"错误。以下是最小改动的修复:
- 先遍历数组找到匹配的元素并记录索引
- 遍历结束后统一判断匹配结果,处理索引0的边界情况
修改后的代码:
this.displayPrevious = function(){ setSearchValues(); /*console.log("Search values are " + searchValueName + "," + searchValueTheme + "," + searchValueReference + "," + searchValuePiece); console.log("Array length is " + legoSets.length);*/ let matchedIndex = -1; // 新增:记录匹配元素的索引 if(legoSets.length>0){ for(let k=0; k < legoSets.length; k++ ){ console.log("This is k " + k); if(legoSets[k].setName === searchValueName){ console.log(legoSets[k].setName + "," + legoSets[k].setTheme + "," + legoSets[k].setReferenceNumber + "," + legoSets[k].setPieceCount); // 注释掉此行,避免k=0时访问legoSets[-1]触发报错 // console.log("previous is " + legoSets[k-1].setName); if(legoSets[k].setTheme === searchValueTheme && legoSets[k].setReferenceNumber === searchValueReference && legoSets[k].setPieceCount === searchValuePiece){ console.log("Full match"); matchedIndex = k; // 记录匹配的索引 break; // 找到匹配项后直接退出循环 } else { displayError("More than one set matched: Duplicate"); return; // 遇到重复直接返回,停止后续遍历 } } // 移除原else分支,不再中途触发"No match found"错误 } // 遍历结束后统一判断匹配结果 if(matchedIndex !== -1){ if((matchedIndex-1)>=0){ setInnerHtml(matchedIndex-1); returnFields(displaySetName,displaySetTheme,displaySetReferenceNumber,displaySetPieceCount); } else { // 可选:如果希望点击第一个元素的previous时循环到最后一个元素,替换下面的错误提示为: // setInnerHtml(legoSets.length - 1); // returnFields(displaySetName,displaySetTheme,displaySetReferenceNumber,displaySetPieceCount); displayError("Array Out of Bounds"); } } else { displayError("No match found: There should have been one"); } } else { displayError("Array Out of Bounds"); } }
关键改动说明:
- 新增
matchedIndex变量存储匹配元素的索引,避免遍历中途触发错误 - 移除循环内部的
else错误分支,改为遍历结束后统一判断是否找到匹配项 - 找到完全匹配项后用
break退出循环,减少不必要的遍历 - 注释掉k=0时访问
legoSets[k-1]的代码,避免数组越界报错
内容的提问来源于stack exchange,提问作者Tufty
相关产品推荐
相关产品推荐

