Как перевести верблюд в змею?

Я хочу преобразовать строку, которая в случае верблюда, в случай змеи, используя TypeScripts. Пример: itemName в item_name, unitPrice в Unit_Price

7 ответов

Решение
const camelToSnakeCase = str => str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);

Вы могли бы сделать что-то вроде этого:

function camelToUnderscore(key) {
   var result = key.replace( /([A-Z])/g, " $1" );
   return result.split(' ').join('_').toLowerCase();
}

console.log(camelToUnderscore('itemName'));

Попробуй это:

function toSnakeCase(inputString) {
    return inputString.split('').map((character) => {
        if (character == character.toUpperCase()) {
            return '_' + character.toLowerCase();
        } else {
            return character;
        }
    })
    .join('');
}
// x = item_name

Я протестировал функцию ниже и обработал большинство своих случаев.

          function convertToSnakeCase(str) {
      str = str[0].toLowerCase() + str.slice(1, str.length).replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
      str  = str.replaceAll(" _","_")

      return str.replaceAll(" ","_").replace(/(^_*|_*$)/g, '');;
   }

Обработано тестовых случаев

      convertToSnakeCase("Payas AsdDs asD")
'payas_asd_ds_as_d'

convertToSnakeCase("Payas AsdDs")
'payas_asd_ds'

convertToSnakeCase("Pay  AsdDs")
'pay__asd_ds'

convertToSnakeCase('test_') 
'test';

Если вы хотите использовать внешние библиотеки, проще всего использовать библиотеку lodash._.snakeCase(string)

Проведя небольшое исследование области регулярных выражений , я обнаружил, что есть интересная функция, называемая позитивным просмотром вперед . (оно соответствует группе после основного выражения, не включая ее в результат)

Предыдущие подходы добавляли к каждому ВЕРХНЕМУ символу префикс_, а также для тех, кто находится в первой позиции строки.

Итак, давайте исправим это, используя позитивный прогноз;)

      function convertCamelToSnake(str){
 return str.replace(/([a-zA-Z])(?=[A-Z])/g,'$1_').toLowerCase()
}

console.log(convertCamelToSnake('camelCaseUrl')) // camel_case_url
console.log(convertCamelToSnake('HereIsABigCamelCaseStr')) // here_is_a_big_camel_case_str

Принятый ответ приведет к_если первый символ в верхнем регистре. Это решает проблему.

       export function camelToSnake(string = '') {
  return (string || '')
    .replace(/([A-Z])/g, (match, group) => `_${group.toLowerCase()}`)
    .replace(/^_/, '')
}
Другие вопросы по тегам