创建Javascript函数时出错

创建Javascript函数时出错,javascript,Javascript,我正试图编写一个函数,将用Snake-Case编写的字符串更改为Camel-Case,但遇到了一个错误 function snakeToCamel(string) { arr = [...string]; for (i of arr) { if (i === "_") { let upperCaseLetter = arr[i+1].toUpperCase(); arr.splice(i+1,1,

我正试图编写一个函数,将用Snake-Case编写的字符串更改为Camel-Case,但遇到了一个错误

function snakeToCamel(string) {
    arr = [...string];
    for (i of arr) {
        if (i === "_") {
            let upperCaseLetter = arr[i+1].toUpperCase();
            arr.splice(i+1,1,upperCaseLetter);
            arr.splice(i,1)
        }
    };
    return arr;
}
错误是。我找不到错误中所述的行中有什么错误。发生了什么事

snakeToCamel("you_dont_know")
snake-to-camel.js:5 Uncaught TypeError: Cannot read property 'toUpperCase' of undefined
    at snakeToCamel (snake-to-camel.js:5)
    at <anonymous>:1:1
snakotocamel(“你不知道”)
snake to camel.js:5未捕获类型错误:无法读取未定义的属性“toUpperCase”
在Snakotocamel(蛇对骆驼.js:5)
时间:1:1

对于of循环,控制变量是数组元素,而不是索引。因此,在您的示例中,
i
是一个字符串。所以
arr[i+1].toUpperCase()
将执行字符串连接,并尝试查找名称类似于
s1
,而不是
1
的属性

如果要使用索引,您需要的是
for
循环或
forEach
调用(甚至
map
,因为这是您正在做的事情),而不是
for of
循环

还有几点需要注意:

  • 您需要确保声明您的变量;现在,您的代码正落入我所说的陷阱,创建了一个名为
    arr
    的全局代码。在
    arr
    之前添加
    const
    let

  • 你没有把
    附加到控制流语句的块之后。(您可以将它们放在那里,因为允许使用空语句,但它们不应该在那里。)

例如,对循环使用

函数(字符串){
//‘const’`
常量arr=[…字符串];
//传统的'for',所以我们有索引
for(设i=0,len=arr.length;i日志(snakotocamel(“一、二、三”)实际上,您已经非常接近解决方案了

我建议您使用普通的for循环,而不是for-of循环。 这样您就可以访问索引
i

function snakeToCamel(string) {
    const arr = [...string];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] === "_") {
            let upperCaseLetter = arr[i+1].toUpperCase();
            arr.splice(i+1,1,upperCaseLetter);
            arr.splice(i,1)
        }
    }
    return arr.join("");
}
函数(字符串){
常量arr=[…字符串];
for(设i=0;i
这是我写的代码。(需要根据干燥原理进行改进)

函数STC(字符串){
常量arr=[…字符串];
让输出=“”;
for(施工通知函){
如果(字母=='"){
输出+=arr[arr.indexOf(字母)+1].toUpperCase()
arr.拼接(arr.indexOf(字母),1)
}否则{
输出+=字母;
}
};返回输出;
}
我只是添加到字符串中,而不是数组中。我还删除了下划线。告诉我它是否有效。

函数(字符串){
常量arr=[…字符串];
arr.forEach((v,i)=>{
如果(v==“uquo”){
arr.splice(i+1,1,arr[i+1].toUpperCase());
阵列拼接(i,1)
}
});
返回arr.join(“”);
}
const result=snakotocamel('a_b_c');
控制台日志(结果)学习调试
for(i of arr){console.log(i,i+1,arr[i+1]);