javascript - Konvertera bindestreck till camel case (camelCase)
Med regex (antar jag) eller någon annan metod, hur kan jag konvertera saker som:
marker-image eller my-example-setting till markerImage eller myExampleSetting.
Jag funderade på att bara dela med - och sedan konvertera indexet av det bindestrecket +1 till versal. Men det verkar ganska smutsigt och jag hoppades på lite hjälp med regex som kan göra koden renare.
Ingen jQuery...
Svar #1
Prova detta:
var camelCased = myString.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); });
Reguljära uttrycket matchar -i i marker-image och fångar endast i. Detta görs sedan till versaler i callback-funktionen och ersätts.
Svar #2
Det här är en av de stora verktygen som Lodash erbjuder om du är insiktsfull och har det inkluderat i ditt projekt.
var str = 'my-hyphen-string';
str = _.camelCase(str);
// results in 'myHyphenString'
Svar #3
Du kan ta bindestrecket och nästa tecken och ersätta det med den stora bokstaven av tecknet:
var str="marker-image-test";
str.replace(/-([a-z])/g, function (m, w) {
return w.toUpperCase();
});
Svar #4
Här är min version av camelCase-funktionen:
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);
};
})();
Den hanterar alla följande kantfall:
- tar hand om både understreck och bindestreck som standard (konfigurerbart med andra parametern)
- sträng med unicode-tecken
- sträng som slutar med bindestreck eller understreck
- sträng som har på varandra följande bindestreck eller understreck
Här är en länk till live-tester: http://jsfiddle.net/avKzf/2/
Här är resultat från tester:
- input: "ab-cd-ef", resultat: "abCdEf"
- input: "ab-cd-ef-", resultat: "abCdEf"
- input: "ab-cd-ef--", resultat: "abCdEf"
- input: "ab-cd--ef--", resultat: "abCdEf"
- input: "--ab-cd--ef--", resultat: "AbCdEf"
- input: "--ab-cd-__-ef--", resultat: "AbCdEf"
Observera att strängar som börjar med avgränsare kommer att resultera i en stor bokstav i början. Om det inte är vad du förväntar dig kan du alltid använda lcfirst. Här är min lcfirst om du behöver den:
function lcfirst(str) {
return str && str.charAt(0).toLowerCase() + str.substring(1);
}
Svar #5
Använd String's replace()-metod med ett reguljärt uttryckslitteral och en ersättningsfunktion.
Till exempel:
'uno-due-tre'.replace(/-./g, (m) => m[1].toUpperCase()) // --> 'unoDueTre'
Förklaring:
'uno-due-tre'är (input)-strängen som du vill konvertera till camel case./-./g(det första argumentet som skickas tillreplace()) är ett reguljärt uttryck literalt.'-.'(mellan snedstrecken) är ett mönster. Det matchar ett enda'-'tecken följt av vilket som helst enskilt tecken. Så för strängen'uno-due-tre'matchar mönstret'-.''-d'och'-t'.
'g'(efter stängningssnedstrecket) är en flagga. Den står för "global" och berättar förreplace()att utföra en global sökning och ersättning, dvs att ersätta alla matchningar, inte bara den första.
(m) => m[1].toUpperCase() (det andra argumentet som skickas till replace()) är ersättningsfunktionen. Den kallas en gång för varje matchning. Varje matchad delsträng ersätts med den sträng som denna funktion returnerar. m (det första argumentet till denna funktion) representerar den matchade delsträngen. Funktionen returnerar den andra tecknet i m i versaler. Så när m är '-d', returnerar denna funktion 'D'.'unoDueTre' är den nya (utdata) strängen som returneras av replace(). Indatasträngen förblir oförändrad.