第 69 题: 如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’AbC' 变成 'aBc'
function processString (s) { var arr = s.split(''); var new_arr = arr.map((item) => { return item === item.toUpperCase() ? item.toLowerCase() : item.toUpperCase(); }); return new_arr.join(''); } console.log(processString('AbC'));
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(57)
str = 'abcDEFg'
strRes = str.replace(/[a-zA-Z]/g,(item)=>{
if(item===item.toUpperCase()){
return item.toLowerCase();
}
return item.toUpperCase()
})
第一个字母没有转换吧==
为啥不顺手把输出结果也贴出来 =。 =
贴上去了
@wangminglmm 感谢,很直观
好像没看到用spread的,我写一下,用regex判断是否是字母, 以及用String.fromCharCode和String.prototype.charCodeAt()来切换大小写。
题目不是只包含字母嘛
const reverseCase = s=>s.split('').reduce((t,c)=>
${t}${c.toUpperCase() === c?c.toLowerCase():c.toUpperCase()}
,'')const change = str => {
let arr = str.split('').map(item => {
return item = item === item.toUpperCase() ? item.toLowerCase() : item.toUpperCase()
})
return arr.join('')
}
change('aBc') // AbC
function transStr(str) {
return str.split('').map(it => String.fromCharCode(it.charCodeAt()<91?it.charCodeAt()+32:it.charCodeAt()-32)).join('')
}
function foo(s) {
return s.replace(/([a-zA-Z])/g, function (match, b, offset, string) {
return match < 'a' ? match.toLowerCase() : match.toUpperCase()
})
}
1、使用
toLowerCase
和toUpperCase
2、使用
fromCharCode
这种方法只适用于只存在英文字母的情况
function letterUpperCaseReserve(string){
let result = [...string].map(item =>{
if(/^[a-z]+$/.test(item)) return item.toUpperCase();
return item.toLowerCase();
})
return result.join('');
}
function reverse(str) { const list = str.split('').map(item => { return item.toLowerCase() === item ? item.toUpperCase() : item.toLowerCase() }) return list.join(''); }
const str = 'AjklAJIBNiuh';
console.log(str)
不用转成数组直接replace操作字符串
let a = 'aB1cd';
const gap = 'a'.charCodeAt() - 'A'.charCodeAt();
const A_ASCII = 'A'.charCodeAt();
const Z_ASCII = 'Z'.charCodeAt();
const test = (a) => a.replace(/[a-zA-Z]/g, (str, value) => {
let ascii_code = str.charCodeAt();
if(ascii_code >= A_ASCII && ascii_code <= Z_ASCII){ //大写
return String.fromCharCode(ascii_code + gap) //转小写
}else{
return String.fromCharCode(ascii_code - gap);
}
})
console.error(test(a));
正则实现:
str.replace(/(w)/g, m => m === m.toUpperCase() ? m.toLowerCase() : m.toUpperCase())
用了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
}
用ASCII做了一下。
'AbcDefGh'.replace(/[a-zA-Z]/g,function(a){ return /[a-z]/.test(a)?a.toUpperCase():a.toLowerCase(); });
@iotale
你这个只考虑了字母,如果有其他字符就行不通了
马上想到的也是一楼的方法,另外也可以:
有没有想到用ascii码的?
问题是只适用于大小写字母区间,不然表现会很怪异。
优化的时候可以做做边界条件。思路应该没问题。