我知道我们有一个与此类似但又不太相同的问题。
我试图使我的函数工作,它接受一个字符串作为参数并将其转换为snake_case。在大多数情况下,它可以与所有!?<>=
精美的字符一起使用,但是在某些情况下,它无法转换,并且其camelCase也无法转换。
当我传递诸如snakeCase
之类的字符串时,它失败。它返回snakecase
而不是snake_case
。
我尝试实现它,但最终却把它弄得更加混乱。
请给我一些帮助吗?
我的代码:
const snakeCase = string => {
string = string.replace(/\W+/g, " ").toLowerCase().split(' ').join('_');
if (string.charAt(string.length - 1) === '_') {
return string.substring(0, string.length - 1);
}
return string;
}
答案 0 :(得分:4)
您需要能够检测到大写字母在字符串中紧接另一个字母(即不跟空格)的点。您可以使用正则表达式,在输入字符串上调用toLowerCase
之前 :
\B(?=[A-Z])
换句话说,是一个非单词边界,后跟一个大写字符。在上面或在文字空间上拆分, then .map
将结果数组转换为小写,然后可以通过下划线连接:
const snakeCase = string => {
return string.replace(/\W+/g, " ")
.split(/ |\B(?=[A-Z])/)
.map(word => word.toLowerCase())
.join('_');
};
console.log(snakeCase('snakeCase'));
答案 1 :(得分:1)
假设字符串为Hello World?
,并且您希望返回的值为hello_world?
(带有字符,然后遵循以下代码)
const snakeCase = (string) => {
return string.replace(/\d+/g, ' ')
.split(/ |\B(?=[A-Z])/)
.map((word) => word.toLowerCase())
.join('_');
};
示例
snakeCase('Hello World?')
// "hello_world?"
snakeCase('Hello & World')
// "hello_&_world"
答案 2 :(得分:0)
我认为这应该涵盖所有基础?
它的灵感来自@ h0r53对已接受答案的回答。但是,它演变为更完整的功能,因为它将按您期望的方式将 any 字符串camelCase
,kebab-case
或其他方式转换为snake_case
,仅包含a-z
和0-9
字符,可用于函数名和变量名:
convert_to_snake_case(string) {
return string.charAt(0).toLowerCase() + string.slice(1) // lowercase the first character
.replace(/\W+/g, " ") // Remove all excess white space and replace & , . etc.
.replace(/([a-z])([A-Z])([a-z])/g, "$1 $2$3") // Put a space at the position of a camelCase -> camel Case
.split(/\B(?=[A-Z]{2,})/) // Now split the multi-uppercases customerID -> customer,ID
.join(' ') // And join back with spaces.
.split(' ') // Split all the spaces again, this time we're fully converted
.join('_') // And finally snake_case things up
.toLowerCase() // With a nice lower case
}
转换示例:
'snakeCase' => 'snake_case'
'CustomerID' => 'customer_id'
'GPS' => 'gps'
'IP-address' => 'ip_address'
'Another & Another, one too' => 'another_another_one_too'
'random ----- Thing123' => 'random_thing123'
'kebab-case-example' => 'kebab_case_example'