将连字符转换为骆驼(camelCase)

与正则expression式(我假设)或其他方法,我怎么能转换的东西,如:

marker-imagemy-example-settingmarkerImagemyExampleSetting

我正在考虑分裂-然后将该hypen + 1的索引转换为大写。 但它似乎很肮脏,希望得到一些正则expression式的帮助,可以使代码更清洁。

没有 jQuery …

尝试这个:

 var camelCased = myString.replace(/-([az])/g, function (g) { return g[1].toUpperCase(); }); 

正则expression式将匹配marker-image中的-i ,并仅捕获i 。 然后在callback函数中将其大写并replace。

这是Lodash提供的伟大的工具之一,如果你是开明的,并将其包含在你的项目中。

 var str = 'my-hyphen-string'; str = _.camelCase(str); // results in 'myHyphenString' 

您可以获取hypen和下一个字符,并将其replace为字符的大写版本:

 var str="marker-image-test"; str.replace(/-([az])/g, function (m, w) { return w.toUpperCase(); }); 

这是我的camelCase函数版本:

 var camelCase = (function () { var DEFAULT_REGEX = /[-_]+(.)?/g; function toUpper(match, group1) { return group1 ? group1.toUpperCase() : ''; } return function (str, delimiters) { return str.replace(delimiters ? new RegExp('[' + delimiters + ']+(.)?', 'g') : DEFAULT_REGEX, toUpper); }; })(); 

它处理所有以下边缘情况:

  • 在默认情况下会同时处理下划线和连字符(可以使用第二个参数进行configuration)
  • 带unicode字符的string
  • 以连字符或下划线结尾的string
  • 具有连续连字符或下划线的string

这是一个链接到现场testing: http : //jsfiddle.net/avKzf/2/

以下是testing结果:

  • input:“ab-cd-ef”,结果:“abCdEf”
  • input:“ab-cd-ef-”,结果:“abCdEf”
  • input:“ab-cd-ef–”,结果:“abCdEf”
  • input:“ab-cd – ef–”,结果:“abCdEf”
  • input:“–ab-cd – ef–”,结果:“AbCdEf”
  • input:“–ab-cd -__- ef–”,结果:“AbCdEf”

请注意,以分隔符开头的string在开头处会产生一个大写字母。 如果这不是你所期望的,你总是可以使用lcfirst。 如果你需要的话,这是我的第一

 function lcfirst(str) { return str && str.charAt(0).toLowerCase() + str.substring(1); } 

这里是另外一个选项,它在这里结合了几个答案,并使它成为一个string的方法:

 if (typeof String.prototype.toCamel !== 'function') { String.prototype.toCamel = function(){ return this.replace(/[-_]([az])/g, function (g) { return g[1].toUpperCase(); }) }; } 

像这样使用:

 'quick_brown'.toCamel(); // quickBrown 'quick-brown'.toCamel(); // quickBrown 
 # Turn the dash separated variable name into camelCase. str = str.replace(/\b-([az])/g, function(all, char) { return char.toUpperCase() }); 

另一个需要。

用于…

 var string = "hyphen-delimited-to-camel-case" or var string = "snake_case_to_camel_case" function toCamelCase( string ){ return string.toLowerCase().replace(/(_|-)([az])/g, toUpperCase ); } function toUpperCase( string ){ return string[1].toUpperCase(); } Output: hyphenDelimitedToCamelCase 

也可以使用indexOf和该任务的recursion。

 input some-foo_sd_dsd-weqe output someFooSdDsdWeqe 

比较:::测量两个不同脚本的执行时间:

 $ node camelCased.js someFooSdDsdWeqe test1: 2.986ms someFooSdDsdWeqe test2: 0.231ms 

码:

 console.time('test1'); function camelCased (str) { function check(symb){ let idxOf = str.indexOf(symb); if (idxOf === -1) { return str; } let letter = str[idxOf+1].toUpperCase(); str = str.replace(str.substring(idxOf+1,idxOf+2), ''); str = str.split(symb).join(idxOf !== -1 ? letter : ''); return camelCased(str); } return check('_') && check('-'); } console.log(camelCased ('some-foo_sd_dsd-weqe')); console.timeEnd('test1'); console.time('test2'); function camelCased (myString){ return myString.replace(/(-|\_)([az])/g, function (g) { return g[1].toUpperCase(); }); } console.log(camelCased ('some-foo_sd_dsd-weqe')); console.timeEnd('test2'); 

这不会为我的RegExp尖叫。 我个人试图避免正则expression式时,简单的string和数组方法就足够了:

 let upFirst = word => word[0].toUpperCase() + word.toLowerCase().slice(1) let camelize = text => { let words = text.split(/[-_]/g) // ok one simple regexp. return words[0].toLowerCase() + words.slice(1).map(upFirst) } camelize('marker-image') // markerImage