【问题标题】:What is the easiest way to convert uppercase special character to lower case special character?将大写特殊字符转换为小写特殊字符的最简单方法是什么?
【发布时间】:2019-07-21 07:04:35
【问题描述】:

我有一个事件处理程序,它可以按下按键。我希望在不按住shift 键时获得等效字符。

我发现不同特殊字符的大小写字符代码不同。

对于字母,在 js 中,我使用 value.toLowerCase() 但这仅适用于字母而不是特殊字符。

没有找到任何自动化的方法,我最终手动编写了这个映射:

const getLowerCaseMap = (val:string)=>{
    //function gets a string of length 1
    switch(val){
        case '~' : return '`' ; 
        case '{' : return '[' ; 
        case '}' : return ']' ; 
        case '"' : return "'" ; 
        case ':' : return ";" ; 
        case '>' : return "." ; 
        case '<' : return "," ; 
        case '?' : return "/" ; 
        case '|' : return "\\" ; 
        case '_' : return "-" ; 
        case '!' : return '1' ; 
        case '@' : return '2' ; 
        case '#' : return '3' ; 
        case '$' : return '4' ; 
        case '%' : return '5' ; 
        case '^' : return '6' ; 
        case '&' : return '7' ; 
        case '*' : return '8' ; 
        case '(' : return '9' ; 
        case ')' : return '0' ; 
        default : return val.toLowerCase()
    }
}

在没有上述映射函数的情况下,javascript 或 hack 中是否有任何函数可以使编写成为可能?

【问题讨论】:

  • 假设[{ 的小写版本是不正确...它们只是不同的字符。您可以通过shift 切换它们,这仅仅是因为您使用的是英文键盘
  • 不同的键盘可以有不同的映射,所以没有自动或原生的功能来做这样的事情,如果你上面的映射涵盖了你所有的情况,那很好,但你不能想当然如果您的用例涵盖所有情况

标签: javascript events


【解决方案1】:

更短(更快?)的版本。函数内部没有映射器定义

const mapper = { '~': '`', '{': '[', '}': ']', '"': "'", ':': ",", '>': ".", '<': ",", '?': "/", '|': "\\", '_': "-", '!': '1', '@': '2', '#': '3', '$': '4', '%': '5', '^': '6', '&': '7', '*': '8', '(': '9', ')': '0', }
Object.freeze(mapper); // making @Code_Maniac happier
const getLowerCaseMap = (val => mapper[val] ||  val.toLowerCase())

console.log(getLowerCaseMap('A'))
console.log(getLowerCaseMap('('))

【讨论】:

  • 但是不变性怎么样,因为它是一个对象,所以它可以被变异,如果它是大型代码库的一部分,那么你可能会无意中发生变异,这可能会导致问题,当你把它放在函数里面就不太容易出现这样的问题
  • 我从来没有遇到过这样的问题。如果您要使用大量文本快速调用您的函数,那么您当然应该缓存地图
  • @CodeManiac 你可以freeze 对象
  • 当你在无限循环中调用它时会发生这种情况,在这种情况下,柯里化函数将是一个更好的选择,
  • 我敢肯定,咖喱目前远远超出 OP 的水平
【解决方案2】:

您可以简单地使用object 作为映射器而不是switch,以模仿default 的开关,您检查对象中的键是否存在,如果它存在则返回相应的值,否则将其小写

const getLowerCaseMap = (val) => {
  let mapper = {
    '~': '`',
    '{': '[',
    '}': ']',
    '"': "'",
    ':': ",",
    '>': ".",
    '<': ",",
    '?': "/",
    '|': "\\",
    '_': "-",
    '!': '1',
    '@': '2',
    '#': '3',
    '$': '4',
    '%': '5',
    '^': '6',
    '&': '7',
    '*': '8',
    '(': '9',
    ')': '0',
  }
  return val in mapper ? mapper[val] : val.toLowerCase()
}

console.log(getLowerCaseMap('A'))
console.log(getLowerCaseMap('('))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多