javascript - Convertir guiones a camel case (camelCase)
Con regex (supongo) u otro método, ¿cómo puedo convertir cosas como:
marker-image o my-example-setting a markerImage o myExampleSetting.
Estaba pensando en simplemente dividir por - y luego convertir el índice de ese guion +1 a mayúscula. Pero parece bastante sucio y esperaba algo de ayuda con regex que pudiera hacer el código más limpio.
No jQuery...
Respuesta #1
Prueba esto:
var camelCased = myString.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); });
La expresión regular hará coincidir el -i en marker-image y capturará solo la i. Esto luego se convierte a mayúscula en la función de devolución de llamada y se reemplaza.
Respuesta #2
Esta es una de las grandes utilidades que Lodash ofrece si estás iluminado y la tienes incluida en tu proyecto.
var str = 'my-hyphen-string';
str = _.camelCase(str);
// results in 'myHyphenString'
Respuesta #3
Puedes obtener el guion y el siguiente carácter y reemplazarlo con la versión en mayúscula del carácter:
var str="marker-image-test";
str.replace(/-([a-z])/g, function (m, w) {
return w.toUpperCase();
});
Respuesta #4
Aquí está mi versión de la función 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);
};
})();
Maneja todos los siguientes casos extremos:
- se encarga tanto de los guiones bajos como de los guiones por defecto (configurable con el segundo parámetro)
- cadena con caracteres unicode
- cadena que termina con guiones o guion bajo
- cadena que tiene guiones o guiones bajos consecutivos
Aquí hay un enlace a pruebas en vivo: http://jsfiddle.net/avKzf/2/
Aquí están los resultados de las pruebas:
- 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 las cadenas que comienzan con delimitadores resultarán en una letra mayúscula al principio. Si eso no es lo que esperas, siempre puedes usar lcfirst. Aquí está mi lcfirst por si lo necesitas:
function lcfirst(str) {
return str && str.charAt(0).toLowerCase() + str.substring(1);
}
Respuesta #5
Usa el método replace() de String con un literal de expresión regular y una función de reemplazo.
Por ejemplo:
'uno-due-tre'.replace(/-./g, (m) => m[1].toUpperCase()) // --> 'unoDueTre'
Explicación:
'uno-due-tre'es la cadena (input) que deseas convertir a camel case./-./g(el primer argumento pasado areplace()) es un literal de expresión regular.- El
'-.'(entre las barras) es un patrón. Coincide con un único carácter'-'seguido de cualquier carácter único. Entonces, para la cadena'uno-due-tre', el patrón'-.'coincide con'-d'y'-t'.
- El
- La
'g'(después de la barra de cierre) es una bandera. Significa "global" y le indica areplace()que realice una búsqueda y reemplazo global, es decir, que reemplace todas las coincidencias, no solo la primera.
(m) => m[1].toUpperCase() (el segundo argumento pasado a replace()) es la función de reemplazo. Se llama una vez por cada coincidencia. Cada subcadena coincidente se reemplaza por la cadena que esta función devuelve. m (el primer argumento de esta función) representa la subcadena coincidente. Esta función devuelve el segundo carácter de m en mayúscula. Así que cuando m es '-d', esta función devuelve 'D'.'unoDueTre' es la nueva cadena (de salida) devuelta por replace(). La cadena de entrada queda sin cambios.