Вот моя версия функции 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);
};
})();
Он обрабатывает все следующие крайние случаи:
- по умолчанию обрабатывает как подчеркивания, так и дефисы (настраивается с помощью второго параметра)
- строка с символами Юникода
- строка, которая заканчивается дефисами или подчеркиванием
- строка с последовательными дефисами или подчеркиванием
Вот ссылка на живые тесты: http://jsfiddle.net/avKzf/2/
Вот результаты тестов:
- вход: "ab-cd-ef", результат: "abCdEf"
- вход: "ab-cd-ef-", результат: "abCdEf"
- вход: "ab-cd-ef--", результат: "abCdEf"
- вход: "ab-cd - ef--", результат: "abCdEf"
- вход: "--ab-cd - ef--", результат: "AbCdEf"
- вход: "--ab-cd -__- ef--", результат: "AbCdEf"
Обратите внимание, что строки, начинающиеся с разделителей, в начале будут содержать заглавную букву. Если это не то, что вы ожидаете, вы всегда можете использовать lcfirst. Вот мое первое, если вам это нужно:
function lcfirst(str) {
return str && str.charAt(0).toLowerCase() + str.substring(1);
}