Daily-Interview-Question icon indicating copy to clipboard operation
Daily-Interview-Question copied to clipboard

第 69 题: 如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’AbC' 变成 'aBc' 。

Open zeroone001 opened this issue 5 years ago • 132 comments

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'));

zeroone001 avatar May 07 '19 23:05 zeroone001

有没有想到用ascii码的?

const STEP = 'a'.charCodeAt() - 'A'.charCodeAt();

function transCase(char) {
  const asciiCode = char.charCodeAt();
  const resultCode = asciiCode < 'a'.charCodeAt() ? asciiCode + STEP : asciiCode - STEP;
  return String.fromCharCode(resultCode);
}

function transStr(str) {
  const charArr = str.split('');
  return charArr.map(char => transCase(char)).join('');
}

问题是只适用于大小写字母区间,不然表现会很怪异。

优化的时候可以做做边界条件。思路应该没问题。

iotale avatar May 08 '19 00:05 iotale

马上想到的也是一楼的方法,另外也可以:


function swapString(str) {
  var result = ''

  for (var i = 0; i < str.length; i++) {
    var c = str[i]

    if (c === c.toUpperCase()) {
      result += c.toLowerCase()
    } else {
      result += c.toUpperCase()
    }
  }

  return result
}

swapString('ADasfads123!@$!@#') // => 'adASFADS123!@$!@#'

suguoyao avatar May 08 '19 00:05 suguoyao

@iotale 你这个只考虑了字母,如果有其他字符就行不通了

transStr('adASjOdapASJO!@#4123123.l124')
// "ADasJoDAPasjoA`CTQRSQRSNLQRT"

suguoyao avatar May 08 '19 00:05 suguoyao

var str = 'AsdfsCsdefsd,$qwsDR'
var mapCode = {
    'A': 'A'.charCodeAt(0),
    'Z': 'Z'.charCodeAt(0),
    'a': 'a'.charCodeAt(0),
    'z': 'z'.charCodeAt(0),
}
var diff = mapCode.a - mapCode.A
var arr = str.split('')
for(var i = 0; i < arr.length; i++) {
    var code = arr[i].charCodeAt(0)
    if(code >= mapCode.A && code <= mapCode.Z) { // 大写
        arr[i] = String.fromCharCode(code + diff) // 转小写
    }else if(code >= mapCode.a && code <= mapCode.z){ // 小写
        arr[i] = String.fromCharCode(code - diff) // 转大写
    }else { // 不是字母
        console.log(arr[i], "不是字母")
        arr.splice(i, 1)
        i--
    }
}
console.log(arr.join(''))

zhuzhh avatar May 08 '19 00:05 zhuzhh

'AbcDefGh'.replace(/[a-zA-Z]/g,function(a){ return /[a-z]/.test(a)?a.toUpperCase():a.toLowerCase(); });

kungithub avatar May 08 '19 01:05 kungithub

用ASCII做了一下。

// 第 69 题: 如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’AbC' 变成 'aBc' 。
const reverseStr = (str) => {
  let tmpAry = str.split('')
  let resultAry = []
  let a = 'a'.charCodeAt()
  let A = 'A'.charCodeAt()
  tmpAry.map((val) => {
    // debugger
    if (val <= 'Z' && val >= 'A') {
      resultAry.push(String.fromCharCode(val.charCodeAt() + (a - A)))
    } else if (val <= 'z' && val >= 'a') {
      resultAry.push(String.fromCharCode(val.charCodeAt() - (a - A)))
    } else {
      resultAry.push(val)
    }
  })
  return resultAry.join('')
}
console.log(reverseStr('aBCDefgh!@##%^$^*!@#$%'))

YouziXR avatar May 08 '19 01:05 YouziXR

[].map.call(str, function(item){     
     return /[a-z]/.test(item) ? item.toUpperCase() : item.toLowerCase(); 
}).join('');

btea avatar May 08 '19 01:05 btea

const reverse = str => {
        let result = ''
	for (let i = 0; i < str.length; i++) {
		if (str[i] > 'Z') {
			result += str[i].toUpperCase()
		} else {
			result += str[i].toLowerCase()
		}
	}
	return result
}

ZodiacSyndicate avatar May 08 '19 02:05 ZodiacSyndicate

fn=(str)=>str.replace(/[A-Za-z]/g,c=>String.fromCharCode(c.charCodeAt()+(c<'['?32:-32)))
fn('-@A[Bc')//"-@a[bC"

Seasonley avatar May 08 '19 02:05 Seasonley

用了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 transformStr1() {
        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转换字符')
    }

wangminglmm avatar May 08 '19 02:05 wangminglmm

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));

FounderIsShadowWalker avatar May 08 '19 02:05 FounderIsShadowWalker

正则实现: str.replace(/(\w)/g, m => m === m.toUpperCase() ? m.toLowerCase() : m.toUpperCase())

xiatian avatar May 08 '19 04:05 xiatian

const str = 'AjklAJIBNiuh'; console.log(str)

let newStr = ''
for (const i of str) {
  let j = '';
  if (/[A-Z]/.test(i)) {
   j =  i.toLowerCase();
   
  } else {
   j = i.toUpperCase();
   
  }
  newStr+=j
}
console.log(newStr)

fuqianxi avatar May 08 '19 04:05 fuqianxi

不用转成数组直接replace操作字符串

function transfer(str) {
  return str.replace(/[a-zA-Z]/g, match => {
    return /[a-z]/.test(match) ? match.toUpperCase() : match.toLowerCase()
  })
}

Bottle1206 avatar May 08 '19 05:05 Bottle1206

function transString(str) {
  if(typeof str !== 'string') return
  let strArr = str.split('')
  return strArr.reduce((acc, cur) => acc += (cur === cur.toUpperCase() ? cur.toLowerCase() : cur.toUpperCase()))
}

lxinr avatar May 08 '19 07:05 lxinr

str = 'abcDEFg' strRes = str.replace(/[a-zA-Z]/g,(item)=>{ if(item===item.toUpperCase()){ return item.toLowerCase(); } return item.toUpperCase() })

weiweixuan avatar May 08 '19 07:05 weiweixuan

function transString (str){
    return Array.prototype.reduce.call(str, (acc, cur) => acc + (cur === cur.toUpperCase() ? cur.toLowerCase() : cur.toUpperCase()), '');
}

kingstone3 avatar May 08 '19 08:05 kingstone3

function test(str) {
  str = str.split('').map(item => {
    if (item === item.toUpperCase()) {
      return item.toLowerCase();
    } else {
      return item.toUpperCase();
    }
  }).join('');
  console.log(str);
}

susiwen8 avatar May 09 '19 06:05 susiwen8

function transString(str){
     return str.split('').map((item) =>{
          return item == item.toLowerCase() ? item.toUpperCase() : item.toLowerCase();
     }).join('');
}

Gintangible avatar May 09 '19 07:05 Gintangible

    /**
    @param: {str} 
    */
    function reversal(str) {
        let newstr = '';
        for(let i = 0 ; i < str.length; i++) {
            console.log(str[i].toUpperCase())
            newstr += (str[i] === str[i].toUpperCase() ? str[i].toLowerCase() : str[i].toUpperCase())
        }
        return newstr;
    }
    console.log(reversal('AbC'))

GuoYuFu123 avatar May 09 '19 11:05 GuoYuFu123

function tranStr(str) {
  if (typeof str !== 'string') return ''
  const splitStr = str.split('')
  return splitStr.reduce((res, s) => {
    if (/[a-z]/g.test(s)) {
      res += s.toLocaleUpperCase()
    } else if (/[A-Z]/g.test(s)) {
      res += s.toLocaleLowerCase()
    } else {
      res += s
    }
    return res
  }, '')
}

44021987 avatar May 10 '19 02:05 44021987

/**
 * 把一个字符串的大小写取反(大写变小写小写变大写),例如 ’AbC' 变成 'aBc'
 * @param {*} str 
 */
function tranStr2(str) {
  if (typeof str !== 'string') return str
  return str.replace(/[a-zA-Z]/g, function(s) {
    return /[a-z]/g.test(s) ? s.toLocaleUpperCase() : /[A-Z]/g.test(s) ? s.toLocaleLowerCase() : s
  })
}

44021987 avatar May 10 '19 02:05 44021987

function transString(str) {
  if(typeof str !== 'string') return
  let strArr = str.split('')
  return strArr.reduce((acc, cur) => acc += (cur === cur.toUpperCase() ? cur.toLowerCase() : cur.toUpperCase()))
}

第一个字母没有转换吧==

cheungkin24 avatar May 10 '19 05:05 cheungkin24

  reverseCase = function (s) {
    const isLowerCase = char => {
      const range = ['a'.charCodeAt(), 'z'.charCodeAt()];
      const charCode = char.charCodeAt();
      return charCode >= range[0] && charCode <= range[1];
    }
    const isUpperCase = char => {
      const range = ['A'.charCodeAt(), 'Z'.charCodeAt()];
      const charCode = char.charCodeAt();
      return charCode >= range[0] && charCode <= range[1];
    }
    return s.split('').map(char => {
      if (isLowerCase(char)) return char.toUpperCase();
      if (isUpperCase(char)) return char.toLowerCase();
    }).join('');
  }

LiuMengzhou avatar May 10 '19 06:05 LiuMengzhou

用了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 transformStr1() {
        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转换字符')
    }

为啥不顺手把输出结果也贴出来 =。 =

LiuMengzhou avatar May 10 '19 06:05 LiuMengzhou

用了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 transformStr1() {
        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转换字符')
    }

为啥不顺手把输出结果也贴出来 =。 =

用了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 transformStr1() {
        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转换字符')
    }

image

wangminglmm avatar May 10 '19 06:05 wangminglmm

用了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 transformStr1() {
        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转换字符')
    }

为啥不顺手把输出结果也贴出来 =。 =

贴上去了

wangminglmm avatar May 10 '19 06:05 wangminglmm

@wangminglmm 感谢,很直观

LiuMengzhou avatar May 10 '19 06:05 LiuMengzhou

好像没看到用spread的,我写一下,用regex判断是否是字母, 以及用String.fromCharCode和String.prototype.charCodeAt()来切换大小写。

const flipByCharCode = (str) => [...str].map((char) => {
    let isAlphabet = /[a-z]/i.test(char);
    let isLowercase = /[a-z]/.test(char);

    return !isAlphabet ? char : String.fromCharCode(char.charCodeAt(0) + 32 * (isLowercase ? -1 : 1));
}).join('');

# 代码写成同行,对手机阅读不友好
const flipByCharCode = (str) => [...str].map((s) => !/[a-z]/i.test(s) ? s : String.fromCharCode(s.charCodeAt(0) + 32 * (/[a-z]/.test(s) ? -1 : 1))).join('');

pengcc avatar May 10 '19 21:05 pengcc

'asdARRADFafkAIoOHFohfhii'.replace(/([a-z]+)|([A-Z]+)/g, function(s, s1, s2){
	return s1 ? s1.toUpperCase() : s2.toLowerCase();
})
// ASDarradfAFKaiOohfOHFHII

leemotive avatar May 11 '19 16:05 leemotive

let map = {
     'a': 'A',
     ....
     'Z': 'z'
};

function reserveCase (str) {
     return str.replace(/([a-z]+)|([A-Z]+)/g, function(a){
	return map[a] || '';
    });
}

cleverboy32 avatar May 15 '19 06:05 cleverboy32

循环字符串,判断是小写还是大写,小写的转化成大写,大写的转化成小写,其他类型的不做处理

let str = 'aBc'
let newStr = ''
for(let i of str) {
  if(/[a-z]/.test(i)) {
    i = i.toUpperCase() 
  } else if(/[A-Z]/.test(i)) {
    i = i.toLowerCase() 
  }
  newStr += i
}
console.log(newStr)

地址

Nolaaaaa avatar May 17 '19 10:05 Nolaaaaa

ES6来一波

const transFormStr = (str) => {
    return str.split('').map(c => c = c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase()).join('');
};

console.log(transFormStr('AbC'))

FlySnails avatar May 20 '19 11:05 FlySnails

'AbC'.replace(/[a-z]/ig, i=> i.match(/[A-Z]/)? i.toLowerCase(): i.toUpperCase())

wushufen avatar May 24 '19 19:05 wushufen

(str.split('').map(v => v.charCodeAt() > 90 ? v.toLocaleUpperCase() : v.toLocaleLowerCase()).join('')

zhangxuanlin avatar Jun 03 '19 10:06 zhangxuanlin


//  the first solution —— 利用 toLowerCase 和 toUpperCase

const reverseLetter0 = str => str.split('').map(item => item !== item.toLowerCase() ? item.toLowerCase() : item.toUpperCase()).join(''); 

console.log(reverseLetter0('Dorsey Hello'));

//  the second solution —— 利用unicode码值
const reverseLetter = str => {

    let res = '';

    for(let i = 0; i < str.length; i ++) {

        res += str[i].charCodeAt() >= 65 && str[i].charCodeAt() <= 90 ? 
            
        String.fromCharCode(str[i].charCodeAt() + 32) : 
        String.fromCharCode(str[i].charCodeAt() - 32);
    }
    return res;
}
console.log(reverseLetter0('AbC'));

dorseysen avatar Jun 27 '19 09:06 dorseysen

function func(str) { 
   return (str+'').split('').reduce((init, next) => {   
       init = init +  next [next.toUpperCase() === next ? 'toLowerCase' : 'toUpperCase']();
       return init
   }, '')
}
function func1(str) {
    return str.replace(/([a-z])|([A-Z])/g,(match, $1, $2) => $1 ? $1.toUpperCase() : $2.toLowerCase())
}
console.log(func('aBcdFddfs'))
console.log(func1('aBcdFddfs'))

bluebrid avatar Jul 09 '19 08:07 bluebrid

'AbC'.split('').map((x)=> (x === x.toLowerCase())?x.toUpperCase():x.toLowerCase()).join('')

yucopowo avatar Jul 09 '19 11:07 yucopowo

function processString (s) { if(!s){ return s; } var arr = s.split(''); var new_arr = arr.map((item) => { if(item >= 'a' && item <= 'z' || item > 'A' && item < 'Z'){ return item === item.toUpperCase() ? item.toLowerCase() : item.toUpperCase(); } else{ return item; }
}); return new_arr.join(''); } console.log(processString('AbC$$&^88'));

web3fans avatar Jul 09 '19 15:07 web3fans

'AbC'.replace(/[a-z]/ig, s => /[a-z]/.test(s) ? s.toUpperCase():s.toLowerCase())

Jhin926 avatar Jul 11 '19 09:07 Jhin926

'AbCaBBHFc'.replace(/([a-z])|[A-Z]/g, (s, c) => c ? s.toUpperCase():s.toLowerCase())

Jhin926 avatar Jul 11 '19 09:07 Jhin926

Array.from("AbCDe").reduce((arr, item) => {
  arr.push( /[A-Z]/.test(item) ? item.toLocaleLowerCase() : item.toLocaleUpperCase())
  return arr
}, []).join("")

Any-time avatar Jul 13 '19 03:07 Any-time

var s='Asxxd3443@'.replace(/([a-z])|([A-Z])/g,(v,...pn)=>pn[0]&&pn[0].toUpperCase()||pn[1]&&pn[1].toLowerCase())
console.log(s)//aSXXD3443@

字符串可以是任意字符

kerrysheng avatar Jul 18 '19 06:07 kerrysheng

"aadGbDDD@44454545/".split("").map(item=>{return item===item.toLowerCase()?item.toUpperCase():item.toLowerCase()}).join('')

leehf avatar Jul 22 '19 08:07 leehf

function wapString(str) { let result = '' for (let i = 0; i < str.length; i++) { if (str[i] <= 'Z' && str[i] >= 'A') { result += str[i].toLowerCase() } else { result += str[i].toUpperCase() } } console.log(result) } wapString('AbC');

liuwenai avatar Jul 23 '19 07:07 liuwenai

function fn(str) {
    return Array.prototype.map.call(str,t=>t.toUpperCase()==t?t.toLowerCase():t.toUpperCase()).join('');
}

var s = 'aBcDeFgHiGk';
console.log(fn(s))

masterminmcj avatar Jul 23 '19 10:07 masterminmcj

str
  .split('')
  .reverse()
  .reduce(
    (str, v) =>
      (str +=
        v === v.toLocaleLowerCase()
          ? v.toLocaleUpperCase()
          : v.toLocaleLowerCase()),
    ''
  );

bWhirring avatar Jul 25 '19 13:07 bWhirring

for (let index in arr){
	if(arr[index].charCodeAt() >90){
		arr[index] = arr[index].toUpperCase()
	}else {
		arr[index] = arr[index].toLowerCase()
	}
}
console.log(arr.join(''));

LastStranger avatar Jul 28 '19 05:07 LastStranger

function transfer(str){
  let result = []
  let arr = str.split('')
  arr.forEach((item)=>{
    let tmp = item.toUpperCase() === item ? item.toLowerCase():item.toUpperCase()
    result.push(tmp)
  })
  return result.join('')
}

console.log(transfer('aBc'))

fyZhang66 avatar Aug 08 '19 10:08 fyZhang66

应该是没人回答位运算吧,ASCII 码中'A' => 65 'a' => 97 差了32 其实只要 运用异或符号一下就可以

65 ^ 32 => 97 97 ^ 32 => 65

String.fromCharCode('A'.charCodeAt() ^ 32 )

pagnkelly avatar Aug 10 '19 16:08 pagnkelly

'AbC'.split('').map((item)=>{
	if(item.match(/[a-z]/)){
		return item.toUpperCase()
	}else if(item.match(/[A-Z]/)){
		return item.toLowerCase()
	}
	return item
}).join('')

helloyoucan avatar Aug 12 '19 01:08 helloyoucan

let str = 'AbC123CCmz'; let reg = /[A-z]/g; let newStr = str.replace(reg, a => a.charCodeAt()<97?a.toLowerCase():a.toUpperCase()) console.log(newStr);

1045598742 avatar Aug 15 '19 09:08 1045598742

关于 @wangminglmm 的 https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/116#issuecomment-491172168

为什么会在 node 下运行结果不同?求解惑

image

yft avatar Aug 17 '19 15:08 yft

'aBcD'.split('').map((item,i)=>{
    return /[a-z]/.test(item)?item.toUpperCase():item.toLowerCase()
}).join('')

GoldWorker avatar Aug 20 '19 07:08 GoldWorker

function fun (s) {
  var a = 97 ;
  var z = a + 25 ;
  var A = 65 ;
  var Z = A + 25;
  const result = Array.from(s).map( char => {
    var code = char.charCodeAt(0);
    if(code >= a && code <= z) return String.fromCharCode(code - 32);
    if(code >= A && code <= Z) return String.fromCharCode(code + 32);
    return char ;
  }) 
  return result.join('')
}

K-walker avatar Aug 21 '19 10:08 K-walker

完善版:

function upperOrLower (s) {
  return Array.from(s).map( char => {
    if(/[a-z]/.test(char)) return char.toUpperCase();
    if(/[A-Z]/.test(char)) return char.toLowerCase();
    return char ;
  }).join('')
}

console.log(upperOrLower('A@nD1!eO'))

K-walker avatar Aug 21 '19 10:08 K-walker

var str="AbC";
var newStr="";
for(let i=0;i<str.length;i++){
	let keyCode=str.charCodeAt(i);
	if(keyCode>=65&&keyCode<=90){
		//是大写字母:
		newStr+=str[i].toLowerCase();
	}else if(keyCode>=97&&keyCode<=122){
		newStr+=str[i].toUpperCase();
	}
	else{
		newStr+=str[i]
	}
}

console.log(newStr)

daiyunchao avatar Aug 22 '19 09:08 daiyunchao

String.fromCharCode(...[...'abC'].map(item => item.charCodeAt() < 97 ? item.charCodeAt() + 32 : item.charCodeAt() - 32))

Linkontoask avatar Aug 28 '19 11:08 Linkontoask

var str = 'AbC';

	function foo(str) {
		const arr = str.split("");
		for(let i=0; i<arr.length; i++){
			if(arr[i] === arr[i].toUpperCase()){
				arr[i] = arr[i].toLowerCase();
			}else{
				arr[i] = arr[i].toUpperCase();
			}
		}
		return arr.join("");
	}

	console.log( foo(str) );

zockbell avatar Aug 29 '19 10:08 zockbell

let a = "aBc123" [...a].map(a => {return a.toUpperCase() === a ? a.toLowerCase() : a.toUpperCase()}).join('') // 输出 "AbC123"

Lokya avatar Aug 30 '19 08:08 Lokya

['', ...'AbC'].reduce((pre, now) => pre + (now === now.toUpperCase() ? now.toLowerCase() : now.toUpperCase()))

KiraYo4kage avatar Sep 09 '19 08:09 KiraYo4kage

    const a = 'AaAaAaAa123456'
    const func = str => str.replace(/[a-zA-Z]/g, v => /[a-z]/.test(v) ? v.toUpperCase() : v.toLowerCase())
    console.log(a); // 'AaAaAaAa123456'
    console.log(func(a)); // 'aAaAaAaA123456'

spongege avatar Sep 12 '19 06:09 spongege

function handle(string){
    return Array.prototype.map.call(string, (item)=>{
        return item === item.toUpperCase() ? item.toLowerCase() : item.toUpperCase();
    }).join('')
}

wxGoldking avatar Sep 18 '19 10:09 wxGoldking

'2aabbAAbDssD1'.replace(/([a-z]+)|([A-Z]+)/g,function(m,s,d){if(d){return d.toLocaleLowerCase() };if(s){return s.toLocaleUpperCase()}}); // "2AABBaaBdSSd1";

huangd-d avatar Oct 08 '19 12:10 huangd-d

function opposite(str) {
  return str.replace(/[a-z]/ig,function (item) {
    return /[A-Z]/.test(item) ? item.toLowerCase() : item.toUpperCase();
  })
}
console.log(opposite('我w的天dxsdEsdf下')); //我W的天DXSDeSDF下

有问题欢迎指正

307590317 avatar Oct 18 '19 07:10 307590317

function transString(str) {
  if(typeof str !== 'string') return
  let strArr = str.split('')
  return strArr.reduce((acc, cur) => acc += (cur === cur.toUpperCase() ? cur.toLowerCase() : cur.toUpperCase()))
}

第一个字母没有转换吧==

改成这样就可以了

function transString(str) {
    if(typeof str !== 'string') return
    let strArr = str.split('')
    return strArr.reduce((acc, cur) => acc += (cur === cur.toUpperCase() ? cur.toLowerCase() : cur.toUpperCase()), '')
}

listentolife avatar Oct 24 '19 01:10 listentolife

const res = '';
for(let item of str){
    res += item.toUpperCase() == item ? item.toLowerCase() : item.toUpperCase()
}
console.log(res)

Wuxiaa avatar Oct 31 '19 07:10 Wuxiaa

[...a].map((v) => v===v.toUpperCase() ? v.toLowerCase() : v.toUpperCase()).join('')

tywei90 avatar Nov 03 '19 09:11 tywei90

[...'AbC'].map(i => i.toLowerCase() === i ? i.toUpperCase() : i.toLowerCase()).join('')

soneway avatar Nov 05 '19 13:11 soneway

let string = 'aBc'; let newString = ''; for (let item of string){ if(item ==item.toLowerCase()){ newString+=item.toUpperCase(); }else{ newString+=item.toLowerCase(); } }

console.log(newString);

772658652 avatar Nov 13 '19 10:11 772658652

let str = "AbC";
    let aa = str.replace(/[A-Za-z]/g,(e)=>{
        if(/[A-Z]/g.test(e)){
            return e.toLowerCase();
        }else if(/[a-z]/g.test(e)){
            return e.toUpperCase();
        }else{
            return e;
        }
    });
console.log(aa);//aBc

licc12 avatar Nov 30 '19 10:11 licc12

是这道题我理解的有问题吗? ??

const processString = str => {
  let newStr =''
  for (let index = 0; index < str.length; index++) {
    newStr += str[index] === str[index].toUpperCase() ? str[index].toLowerCase() : str[index].toUpperCase()
  }
  return newStr
}

1576484742347

coveyz avatar Dec 16 '19 08:12 coveyz

"aBcdEfg".replace(/\w/g,function(item){return item === item.toUpperCase() ? item.toLowerCase() : item.toUpperCase() })

xiaoang avatar Dec 18 '19 08:12 xiaoang

const str = 'aBcDcAS'
const transform = str => str.replace(/([a-z])|([A-Z])/g, (e) => {
    return /[a-z]/.test(e) ? e.toUpperCase() : e.toLowerCase()
})
transform(str)

xiaoshenjing avatar Jan 01 '20 13:01 xiaoshenjing

let  invertString = (str) => {
  let stringArr = str.split('');
  let newArr = [];
  for (let index = 0; index < stringArr.length; index++) {
    var element = stringArr[index];
    if(element<'A' || element>'Z') {
      element = element.toUpperCase();
    } else {
      element = element.toLowerCase();
    }
    newArr.push(element);
  }
  return newArr.join('');
}

lakalakaka avatar Jan 07 '20 03:01 lakalakaka

// 想法是根据unciode来的 let tmp = ''; let str = 'AbC'; for (let i = 0; i < str.length; i++) { if (str.codePointAt(i) >= 65 && str.codePointAt(i) <= 90) { tmp += str[i].toLowerCase(); } else { tmp += str[i].toUpperCase(); } } console.log(tmp);

SnailOwO avatar Jan 15 '20 09:01 SnailOwO

"AbC".replace(/\w/g, (s) => {
    return s === s.toLowerCase() ? s.toUpperCase() : s.toLowerCase()
})

zenglinan avatar Feb 23 '20 05:02 zenglinan

'AHdjjjSSS'.replace(/[a-zA-Z]/g, function(match){
  if (match.charCodeAt(0) < 97) {
    return match.toLowerCase()
  }
    return match.toUpperCase()
})

PengSama avatar Mar 18 '20 14:03 PengSama

let str1 = 'AbC'

function toggle(str) {
  let s =''
  for (let i in str) {
    if (str[i] === str[i].toUpperCase()) {
      s += str[i].toLowerCase()
    } else {
      s += str[i].toUpperCase()
    }
  }
  return s
}

toggle(str1)

litokele2018 avatar Mar 24 '20 07:03 litokele2018

let str = 'AbC';

const stringReverse = (str) => str.split('').map(i =>
 i===i.toUpperCase()?i.toLowerCase():i.toUpperCase()).join('')

let res = stringReverse(str)
console.log(res); //'aBc'

jingsy avatar Apr 01 '20 07:04 jingsy

const str = 'AbC'
let result = ''
const a = 91

for (let i = 0; i < str.length; ++i) {
  const code = str.charCodeAt(i)
  result += code > 91 ? str[i].toUpperCase() : str[i].toLowerCase()
}

console.log(result)

zuoyi615 avatar Apr 17 '20 06:04 zuoyi615

'AbC'.split('').map(x => {if (x.charCodeAt() <= 97) return x.toLocaleLowerCase(); return x.toLocaleUpperCase()}).join('')

UnrealCherry avatar May 04 '20 17:05 UnrealCherry

aa.replace(/([a-z])|([A-Z])/g,function(a,b,c){
    return b?b.toUpperCase():c.toLowerCase()
})

正则处理一下,当然正则效率低

aitexiaoy avatar May 12 '20 14:05 aitexiaoy

const processStr = str => str.split('').map(
    item => item === item.toUpperCase() 
    ? item.toLowerCase() 
    : item.toUpperCase()
).join('')

chinadbo avatar May 14 '20 01:05 chinadbo

function overturnStr(str) {
  let newStr = ''
  for (let s of str) {
    if (s.toUpperCase() === s) {
      newStr += s.toLowerCase()
    }
    newStr += s.toUpperCase()
  }
  return newStr
}

zhangpanfei avatar May 28 '20 07:05 zhangpanfei

var str = 'AbC' str.replace(/[a-zA-Z]/g, (s) => { const l = /[a-z]/g const u = /[A-Z]/g if (l.test(s)) { return s.toUpperCase() } if (u.test(s)) { return s.toLowerCase() } })

lanshanmao avatar Jun 02 '20 17:06 lanshanmao

const str = 'AbC'

console.log(
  str.split('').map((item) => (item.toUpperCase() !== item ? item.toUpperCase() : item.toLowerCase())).join('')
)

eatureide avatar Jun 11 '20 05:06 eatureide

function strA(str){ 
    let p = str.split('');
    let s ='';
    for(let i =0; i< p.length; i++){
        if(p[i].toUpperCase() === p[i]){
            s += p[i].toLowerCase();
        }else {
           s += p[i].toUpperCase();
       }
    }
    return s;
};
strA('aBc') // => "AbC"

jackchang2015 avatar Jun 13 '20 09:06 jackchang2015

const str = 'aBc';

str
  .split('')
  .map((char) => {
    const tmp = char.toUpperCase();
    return tmp === char ? char.toLowerCase() : tmp;
  })
  .join('');

lsbbd avatar Jul 16 '20 10:07 lsbbd

------------------ 原始邮件 ------------------ 发件人: "Advanced-Frontend/Daily-Interview-Question" <[email protected]>; 发送时间: 2020年7月16日(星期四) 晚上6:12 收件人: "Advanced-Frontend/Daily-Interview-Question"<[email protected]>; 抄送: "my9080"<[email protected]>;"Comment"<[email protected]>; 主题: Re: [Advanced-Frontend/Daily-Interview-Question] 第 69 题: 如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’AbC' 变成 'aBc' 。 (#116)

const str = 'aBc'; str .split('') .map((char) => { const tmp = char.toUpperCase(); return tmp === char ? char.toLowerCase() : tmp; }) .join('');

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

zockbell avatar Jul 17 '20 01:07 zockbell

// 版本一
const reverseCharacterCase = str => [...str]
  .map(character => {
    /* TODO 验证参数 */
    const charCode = character.charCodeAt();
    return String.fromCharCode(charCode + (charCode > 90 ? -32 : 32));
  })
  .join('');
console.log(reverseCharacterCase('sdFuIa')); // SDfUiA

// 版本二
const reverseCharacterCaseSlim = str => [...str].map(character => String.fromCharCode(character.charCodeAt() + (character.charCodeAt() > 90 ? -32 : 32))).join('');
console.log(reverseCharacterCaseSlim('sdFuIa')); // SDfUiA

taichiyi avatar Jul 21 '20 08:07 taichiyi

const reverseCase = str => {
    let s = '';
    for(let i of str){
        if(i === i.toUpperCase()){
            s += i.toLowerCase();
        }else {
           s += i.toUpperCase();
        }
    }
    return s;
};
reverseCase('abCDeFgHe'); // "ABcdEfGhE"

jackchang2015 avatar Jul 27 '20 09:07 jackchang2015

var str = "AbC==-3.$%^&*……"


str.replace(/([a-zA-Z])/g, (match) => /[a-z]/.test(match) ? match.toUpperCase() : match.toLowerCase())

RoeyXie avatar Jul 30 '20 15:07 RoeyXie

function reverseCase(str){
    return str.split('').map(item => {
        return item === item.toUpperCase()? item.toLowerCase(): item.toUpperCase()}).join('');
};
reverseCase('abCDeFgHe'); // "ABcdEfGhE"

jackchang2015 avatar Aug 20 '20 05:08 jackchang2015

str
.split('')
.map((char) => {
	const code = char.charCodeAt()
	if (code >= 97) {
		return String.fromCharCode(code - 32)
	} else {
		return String.fromCharCode(code + 32)
	}
})
.join('')

XuedaoYuan avatar Sep 18 '20 03:09 XuedaoYuan

let invertCase = (str)=>{
    let [uA,uZ,ua,uz] = ['A'.charCodeAt(), 'Z'.charCodeAt(), 'a'.charCodeAt(), 'z'.charCodeAt()]

    return Array.prototype.map.call(str, (item,index)=>{
        if (item.charCodeAt() >= uA && item.charCodeAt() <= uZ)
            return item.toLowerCase()
        else if (item.charCodeAt() >= ua && item.charCodeAt() <= uz)
            return item.toUpperCase()
        else
            return item
    }
    ).join('')
}

gogoend avatar Sep 24 '20 09:09 gogoend

const reverseChar= (c) => {
  const lc = c.toLowerCase()
  return c == lc ? c.toUpperCase() : lc
}
const reverseCase = (str) => {
  let len = str.length
  let res = ''
  for(let i=0; i<len; i++) {
    res += reverseChar(str[i])
  }
  return res
}
console.log(reverseCase('AbC'))

m7yue avatar Oct 15 '20 11:10 m7yue

@iotale 你这个只考虑了字母,如果有其他字符就行不通了

transStr('adASjOdapASJO!@#4123123.l124')
// "ADasJoDAPasjoA`CTQRSQRSNLQRT"

题目不是只包含字母嘛

hanhang123 avatar Nov 14 '20 09:11 hanhang123

const reverseCase = s=>s.split('').reduce((t,c)=>${t}${c.toUpperCase() === c?c.toLowerCase():c.toUpperCase()},'')

Dujishi avatar Nov 22 '20 07:11 Dujishi

const toLowerUpperCase = (str = '') => {
    return str.split('').map(val => val === val.toUpperCase() ? val.toLowerCase() : val.toUpperCase()).join('')
}

console.log(toLowerUpperCase('AbC'));

blank1u avatar Dec 08 '20 15:12 blank1u