CodeWars中驼峰命名方法函数返回类型错误排查求助
搞定你的驼峰命名转换问题!
嘿,我发现你代码里的问题啦——它没处理空字符串或者末尾带空格的边缘情况,这就是为啥在CodeWars上会报错,而其他环境没触发这个问题的原因。
问题到底出在哪?
先看看你的代码:
String.prototype.camelCase=function(){ string = this.split(''); string[0] = string[0].toUpperCase(); // 空字符串时这里直接炸 for (let i = 0; i < string.length; i ++) { if (string[i] === ' ') { string[i + 1] = string[i + 1].toUpperCase(); // 空格在末尾时,i+1是undefined string.splice(i, 1); i--; } } return string.join(''); }
两个致命小漏洞:
- 如果输入是空字符串,
this.split('')得到的是空数组,string[0]就是undefined,调用toUpperCase()直接抛出TypeError。 - 如果字符串最后一个字符是空格,循环到这个位置时,
i+1已经超出数组范围,对应的值是undefined,同样会触发报错。
其他测试环境可能没覆盖这些边缘场景,但CodeWars的测试集肯定包含了这些情况,所以才会出现前两个用例过了,后面失败的情况。
给你两种修复方案
方案一:修补原逻辑
如果想保留你原来的思路,只需要加几个判断就行:
String.prototype.camelCase = function() { const chars = this.split(''); // 先处理空字符串,直接返回空 if (chars.length === 0) return ''; // 第一个字符转大写(如果不是空格的话) chars[0] = chars[0].toUpperCase(); for (let i = 0; i < chars.length; i++) { if (chars[i] === ' ') { // 先确认下一个字符存在,再转大写 if (i + 1 < chars.length) { chars[i + 1] = chars[i + 1].toUpperCase(); } // 删掉当前的空格 chars.splice(i, 1); i--; } } return chars.join(''); };
方案二:用正则简化实现
其实用正则表达式能更简洁地搞定所有情况,还不容易出错:
String.prototype.camelCase = function() { // 先去掉首尾空格,然后把每个空格后的字符转大写,同时删掉空格 return this.trim().replace(/(?:^|\s)(\w)/g, (match, char) => char.toUpperCase()); };
这个版本自动处理空字符串、开头/结尾空格、中间多空格等各种情况,代码也更清爽。
测试下这些场景
- 空字符串:
''.camelCase()→ 返回'' - 末尾带空格:
'camel case method '.camelCase()→ 返回'CamelCaseMethod' - 开头带空格:
' hello world'.camelCase()→ 返回'HelloWorld' - 正常用例:
'camel case method'.camelCase()→ 返回'CamelCaseMethod'
这样修改后,应该能通过CodeWars上的所有测试用例啦!
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

