问题
如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’AbC' 变成 'aBc'
答案
答案不是唯一这里我先分享两种方式
1. 正则表达式
'aBc'.replace(/[a-zA-Z]/g,function(a){ return /[a-z]/.test(a)?a.toUpperCase():a.toLowerCase();})});
// "AbC"
2. 循环判断大小写
'aBc'.split('').map((n,i)=>(n === n.toUpperCase() ? n.toLowerCase() : n.toUpperCase())).join('');
// "AbC"
用了3种实现方法处理千万级别长度字符,对比了下时间,分享给大家,for循环+unicode转行相对较快
function getRandomStr() {
let str = ''
let arr = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S","T", "U", "V", "W", "X", "Y", "Z","a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t","u", "v", "w", "x", "y", "z"]
for (let i = 0; i < 10000000; i++) {
let num = parseInt(Math.random() * 53)
str += arr[num]
}
return str
}
function transformStr() {
console.time('生成1千万长度字符串用时')
let str = getRandomStr()
console.timeEnd('生成1千万长度字符串用时')
// console.log(str)
console.time('使用正则替换用时')
let str1 = str.replace(/./g, (input) => {
let num = input.charCodeAt(0)
if (num >= 65 && num <= 90) {
return String.fromCharCode(num + 32)
} else {
return String.fromCharCode(num - 32)
}
})
console.timeEnd('使用正则替换用时')
// console.log(str)
console.time('使用for循环耗时')
let str2 = ''
for (let i = 0, len = str.length; i < len; i++) {
let s = str[i]
let num = s.charCodeAt(0)
if (num >= 65 && num <= 90) {
str2 += String.fromCharCode(num + 32)
} else {
str2 += String.fromCharCode(num - 32)
}
}
console.timeEnd('使用for循环耗时')
console.log(str1 === str2)
console.time('使用toUppercase逐个转换耗时')
let str3 = ''
for (let i = 0, len = str.length; i < len; i++) {
let s = str[i]
let sUp = s.toUpperCase()
if (sUp === s) {
str3 += s.toLocaleLowerCase()
} else {
str3 += sUp
}
}
console.timeEnd('使用toUppercase逐个转换耗时')
console.log(str2 === str3)
console.time('使用toUppercase转换字符')
}
/*
生成1千万长度字符串用时: 21243.43701171875ms
使用正则替换用时: 1378ms
使用for循环耗时: 1829.082763671875ms
true
使用toUppercase逐个转换耗时: 5212.477783203125ms
true
*/
可能还有其他方式来解决这个问题,欢迎大佬留言,相互学习!
网友评论