web-dev-qa-db-fra.com

Convertir une chaîne séparée par un tiret en camelCase?

Par exemple, supposons que j'ai toujours une chaîne délimitée par "-". Y a-t-il un moyen de transformer

c'est-un-grand-jour aujourd'hui

à

c'estJeuAGreatDayAujourd'hui

Vous utilisez RegEx?

37
Hoa

Oui (édité pour prendre en charge les entrées non minuscules et Unicode)}:

function camelCase(input) { 
    return input.toLowerCase().replace(/-(.)/g, function(match, group1) {
        return group1.toUpperCase();
    });
}

En savoir plus sur "remplacer les rappels" sur les MDN "Spécification d'une fonction en tant que paramètre" documentation.

Le premier argument de la fonction de rappel est la correspondance complète et les arguments suivants sont les groupes entre parenthèses dans l'expression régulière (dans ce cas, le caractère après le trait d'union).

70
apsillers

Vous pouvez apparier le caractère Word après chaque tiret (-) ou le début de la chaîne, ou simplifier en faisant correspondre le caractère Word après chaque limite de Word (\b):

function camelCase(s) {
  return (s||'').toLowerCase().replace(/(\b|-)\w/g, function(m) {
    return m.toUpperCase().replace(/-/,'');
  });
}
camelCase('foo-bar'); // => 'FooBar'
camelCase('FOo-BaR-gAH'); // => 'FooBarGah'
5
maerics

Voici une démo

var test = 'It-is-a-great-day-today';

function camelize(str) {
    return str[0].toLowerCase() + str.replace(/-([a-z])/g, function(a, b) {
        return b.toUpperCase();
    }).slice(1);
}

console.log(camelize(test));
3
Joseph

Cela devrait également fonctionner:

function camelCase(str) {
  return str.replace(/^.|-./g, function(letter, index) {
    return index == 0 ? letter.toLowerCase() : letter.substr(1).toUpperCase();
  });
}

Et à mon humble avis, il est un peu plus efficace puisque nous ne convertissons pas d’abord la chaîne d’entrée en minuscule, puis de la convertir en majuscule si nécessaire. Cette fonction ne convertit que la première lettre en minuscule, puis chaque caractère après le tiret - en majuscule.

3
anubhava

Cela fonctionne très bien, mais quelqu'un pourrait peut-être le nettoyer.

var toCamelCase = function(str) {
        // Replace special characters with a space
        str = str.replace(/[^a-zA-Z0-9 ]/g, " ");
        // put a space before an uppercase letter
        str = str.replace(/([a-z](?=[A-Z]))/g, '$1 ');
        // Lower case first character and some other stuff that I don't understand
        str = str.replace(/([^a-zA-Z0-9 ])|^[0-9]+/g, '').trim().toLowerCase();
        // uppercase characters preceded by a space or number
        str = str.replace(/([ 0-9]+)([a-zA-Z])/g, function(a,b,c) {
            return b.trim() + c.toUpperCase();
        });
        return str;
};

console.log(toCamelCase('hyphen~name~ format'));
console.log(toCamelCase('hyphen.name.format'));
console.log(toCamelCase('hyphen-name-format'));
console.log(toCamelCase('Hyphen-Dame-Gormat'));
console.log(toCamelCase('EquipmentClass name'));
console.log(toCamelCase('Equipment className'));
console.log(toCamelCase('equipment class name'));
console.log(toCamelCase(' e    Equipment Class Name'));
console.log(toCamelCase('under9score_name_format'));
console.log(toCamelCase('Enderscore_name_format'));
console.log(toCamelCase('EnderscoreBameFormat'));
console.log(toCamelCase('_EnderscoreBameFormat'));

http://jsbin.com/yageqi/1/edit?js,console

2
codeBelt

Je sais que cette question est un peu vieille mais

Voici ma version de la fonction 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);
    };
})();

Il gère tous les cas Edge suivants:

  • prend en charge les traits de soulignement et les traits d'union par défaut (configurable avec le second paramètre)
  • chaîne avec caractères Unicode
  • chaîne qui se termine par un trait d'union ou un trait de soulignement
  • chaîne qui a des traits d'union ou des traits de soulignement consécutifs

Voici un lien pour les tests en direct: http://jsfiddle.net/avKzf/2/

Voici les résultats des tests:

  • entrée: "ab-cd-ef", résultat: "abCdEf"
  • entrée: "ab-cd-ef-", résultat: "abCdEf"
  • entrée: "ab-cd-ef--", résultat: "abCdEf"
  • entrée: "ab-cd - ef--", résultat: "abCdEf"
  • entrée: "--ab-cd - ef--", résultat: "AbCdEf"
  • entrée: "--ab-cd -__- ef--", résultat: "AbCdEf"

Notez que les chaînes commençant par des délimiteurs génèrent une lettre majuscule au début . Si ce n'est pas ce que vous attendez, vous pouvez toujours utiliser lcfirst .

function lcfirst(str) {
    return str && str.charAt(0).toLowerCase() + str.substring(1);
}
2
Joon

Une autre méthode utilisant réduire :

function camelCase(str) {
  return str
    .split('-')
    .reduce((a, b) => a + b.charAt(0).toUpperCase() + b.slice(1));
}
2
Lior Erez

Voir http://jsfiddle.net/54ZcM/

function camelCase(string) {
    return string.toLowerCase().replace(/(\-[a-zA-Z])/g, function($1) {
        return $1.toUpperCase().replace('-','');
    })
}

alert(camelCase('fOo-BarBA-fo'));
1
Gabriel Santos
var string = "it-is-a-great-day-today";
or
var string = "it_is_a_great_day_today";

var regex = /(_|-)([a-z])/g;

string.toLowerCase().replace(regex, toCamelCase );

function toCamelCase( string ){
  return string[1].toUpperCase();
}

Output: "itIsAGreatDayToday";
1
SoEzPz

voici le jsfiddle avec lequel vous pouvez jouer pour tester ceci http://jsfiddle.net/5n84w/2/

`` `

/**
 * Function to convert any string to camelCase
 * var regex = 'chetan-Ankola###.com---m13ok#-#alo(*finding!R%S#%-GFF'; 
 * Where [-_ .] is the seperator, you can add eg: '@' too
 * + is to handle repetition of seperator           
 * ? is to take care of preceeding token 
 * match nov(ember)? matches nov and november
 */
var camelCaser = function (str) {
    var camelCased = str.replace(/[-_ .]+(.)?/g, function (match, p) {
        if (p) {
            return p.toUpperCase();
        }
        return '';
    }).replace(/[^\w]/gi, '');
    return camelCased;
};

`` `

0
Chetan Ankola
'it-is-a-great-day-today'.split('-').map(function(x,i){
    return (i?x[0].toUpperCase():x[0]) + x.slice(1).toLowerCase()
}).join('')

Résultat:

'itIsAGreatDayToday'

Sinon, .match(/\w+/g) plutôt que .split('-') - selon ce que vous voulez faire dans les cas Edge, par exemple "this - is-a-test".

0
ninjagecko