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 till replace()) ä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ör replace() 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.

Relaterade artiklar