22

假设我有一个转换kebab-case为的函数camelCase

camelize("my-kebab-string") === 'myKebabString';

我快到了,但我的代码也输出了第一个大写字母:

function camelize(str){
  let arr = str.split('-');
  let capital = arr.map(item=> item.charAt(0).toUpperCase() + item.slice(1).toLowerCase());
  let capitalString = capital.join("");

  console.log(capitalString);
}
    
camelize("my-kebab-string");
4

4 回答 4

44

您也可以尝试正则表达式。

camelize = s => s.replace(/-./g, x=>x[1].toUpperCase())

仅查找后跟任何字符的连字符,并将其大写并将连字符+字符替换为大写字符。

于 2020-03-18T11:48:11.983 回答
14

为了保留您现有的代码,我刚刚添加了对索引的检查,item如果 item 为 0(假),该索引将返回而不是转换后的项目,因为问题只是您也在大写第一个项目,而你不应该。

简而言之,内联表达式变为:(item, index) => index ? item.charAt(0).toUpperCase() + item.slice(1).toLowerCase() : item,因为:

  • 如果 index 不是 falsy(因此,如果 index 在您的上下文中 > 0),则返回大写字符串。
  • 否则,返回当前项目。

当然,这可能更简洁,并且可能是单行代码,但我希望尽可能接近您的代码,以便您了解问题所在:

function camelize(str){
  let arr = str.split('-');
  let capital = arr.map((item, index) => index ? item.charAt(0).toUpperCase() + item.slice(1).toLowerCase() : item.toLowerCase());
  // ^-- change here.
  let capitalString = capital.join("");

  console.log(capitalString);
}

camelize("my-kebab-string");

作为旁注,您可以在这里找到一个潜在的更清晰的答案:将任何字符串转换为驼峰式

于 2019-08-19T12:16:13.907 回答
3

对于lodash用户:

_.camelCase('my-kebab-string') => 'myKebabString'
于 2020-06-28T15:50:27.850 回答
2

capital第一种方法是将数组的第一个条目转换为小写,如下所示:

capital[0] = capital[0].toLowerCase();

另一种我认为更有效的方法是将另一个参数传递给map回调,即index. 看看这个以进一步阅读: https ://www.w3schools.com/jsref/jsref_map.asp

所以你只转换为大写if (index > 0)。像这样:

let capital = arr.map((item, index) => index ? item.charAt(0).toUpperCase() + item.slice(1).toLowerCase() : item);
于 2019-08-19T12:14:54.367 回答