JavaScript indexOf未定义报错排查:吉他和弦转调功能开发问题
问题分析与修复
你的代码里有几个关键问题导致了错误和功能异常:
indexOf调用错误indexOf是数组的实例方法,必须通过目标数组调用,你直接写indexOf(chordShapes[j])相当于调用不存在的全局indexOf,所以触发报错。其实在嵌套循环中,当找到匹配项时,j就是当前和弦在chordShapes中的索引,直接使用j即可,无需额外调用indexOf。循环范围错误
循环条件i < inpArr.length-1会跳过最后一个输入和弦(比如输入["A","E"]时,i只会遍历到0,不会处理"E");同理j < chordShapes.length-1会漏掉最后一个和弦D# / Eb。正确的条件应该是i < inpArr.length和j < chordShapes.length。return位置错误
你把return newArr放在了外层for循环内部,这会导致函数在第一次循环后就直接返回,无法处理后续的输入和弦。应该将return放在函数末尾,等所有循环执行完成后再返回结果。
修正后的代码
let chordShapes = ["E", "F", "F# / Gb", "G", "G# / Ab", "A", "A# / Bb", "B", "C", "C# / Db", "D", "D# / Eb"]; let inputChords = ["A", "E"]; function findNums(inpArr){ let newArr = []; // 遍历所有输入和弦 for(let i=0; i < inpArr.length; i++){ // 遍历预设和弦数组找匹配 for(let j=0; j < chordShapes.length; j++){ if(inpArr[i] === chordShapes[j]){ newArr.push(j); // 直接把索引加入结果数组 console.log(`inputNum: ${j}`); break; // 找到匹配后跳出内层循环,避免无效遍历 } } } return newArr; // 所有处理完成后返回结果 }; console.log(findNums(inputChords)); // 输出 [5, 0]
额外优化建议
可以用数组的map方法简化代码,省去嵌套循环,逻辑更简洁清晰:
function findNums(inpArr){ return inpArr.map(chord => chordShapes.indexOf(chord)); }
这个方法会遍历输入数组的每个元素,直接返回其在chordShapes中的索引,结果和修正后的循环代码完全一致。
内容的提问来源于stack exchange,提问作者Nolan Williams
相关产品推荐
相关产品推荐

