Как перевести верблюд в змею?
Я хочу преобразовать строку, которая в случае верблюда, в случай змеи, используя 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(/^_/, '')
}