You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript indexOf未定义报错排查:吉他和弦转调功能开发问题

问题分析与修复

你的代码里有几个关键问题导致了错误和功能异常:

  1. indexOf调用错误
    indexOf是数组的实例方法,必须通过目标数组调用,你直接写indexOf(chordShapes[j])相当于调用不存在的全局indexOf,所以触发报错。其实在嵌套循环中,当找到匹配项时,j就是当前和弦在chordShapes中的索引,直接使用j即可,无需额外调用indexOf。

  2. 循环范围错误
    循环条件i < inpArr.length-1会跳过最后一个输入和弦(比如输入["A","E"]时,i只会遍历到0,不会处理"E");同理j < chordShapes.length-1会漏掉最后一个和弦D# / Eb。正确的条件应该是i < inpArr.length和j < chordShapes.length。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:39:22