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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:13:52