Aqui está a minha versão da função 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);
};
})();
Ele lida com todos os seguintes casos de borda:
- cuida de sublinhados e hífens por padrão (configurável com o segundo parâmetro)
- string com caracteres unicode
- string que termina com hífens ou sublinhado
- sequência que possui hífens ou sublinhados consecutivos
Aqui está um link para testes ao vivo: http://jsfiddle.net/avKzf/2/
Aqui estão os resultados dos testes:
- entrada: "ab-cd-ef", resultado: "abCdEf"
- entrada: "ab-cd-ef-", resultado: "abCdEf"
- entrada: "ab-cd-ef--", resultado: "abCdEf"
- entrada: "ab-cd - ef--", resultado: "abCdEf"
- entrada: "--ab-cd - ef--", resultado: "AbCdEf"
- entrada: "--ab-cd -__- ef--", resultado: "AbCdEf"
Observe que as seqüências que começam com delimitadores resultarão em uma letra maiúscula no início. Se não é o que você esperaria, você sempre pode usar lcfirst. Aqui está o meu lcfirst se você precisar:
function lcfirst(str) {
return str && str.charAt(0).toLowerCase() + str.substring(1);
}