【问题标题】:How to get the next letter of the alphabet in Javascript?如何在Javascript中获取字母表的下一个字母?
【发布时间】:2011-01-16 10:18:24
【问题描述】:

我正在构建一个从 CouchDB 视图中搜索的自动完成功能。

我需要能够获取输入字符串的最后一个字符,并将最后一个字符替换为英文字母的下一个字母。 (这里不需要 i18n)

例如:

  • 输入字符串 = "b"
  • 开始键 = "b"
  • endkey = "c"

  • 输入字符串 = "foo"
  • startkey = "foo"
  • endkey = "fop"

(如果您想知道,我会确保包含选项 inclusive_end=false 以便这个额外的字符不会污染我的结果集)


问题

  • Javascript 中是否有一个函数可以直接获取字母表中的下一个字母?
  • 或者我是否只需要吸收它并使用诸如“abc...xyz”和indexOf()之类的基本字符串执行我自己的奇特函数?

【问题讨论】:

    标签: javascript jquery jquery-ui autocomplete couchdb


    【解决方案1】:
    my_string.substring(0, my_string.length - 1)
          + String.fromCharCode(my_string.charCodeAt(my_string.length - 1) + 1)
    

    【讨论】:

    • 但要注意 z/Z z +1 = {Z +1 = [ 的边缘情况
    • @ictoofay 谢谢,这很快就奏效了。 @Gaby 感谢您的提醒!
    【解决方案2】:

    // 这将为 Z 返回 A,为 z 返回 a。

    function nextLetter(s){
        return s.replace(/([a-zA-Z])[^a-zA-Z]*$/, function(a){
            var c= a.charCodeAt(0);
            switch(c){
                case 90: return 'A';
                case 122: return 'a';
                default: return String.fromCharCode(++c);
            }
        });
    }
    

    【讨论】:

    • 老实说,我期待的东西与 'a'++ 的速度并驾齐驱,而不是整个正则表达式
    【解决方案3】:

    更全面的解决方案,根据 MS Excel 对其列的编号方式获取下一个字母...A B C ... Y Z AA AB ... AZ BA ... ZZ AAA

    这适用于小写字母,但您也可以轻松地将其扩展为大写字母。

    getNextKey = function(key) {
      if (key === 'Z' || key === 'z') {
        return String.fromCharCode(key.charCodeAt() - 25) + String.fromCharCode(key.charCodeAt() - 25); // AA or aa
      } else {
        var lastChar = key.slice(-1);
        var sub = key.slice(0, -1);
        if (lastChar === 'Z' || lastChar === 'z') {
          // If a string of length > 1 ends in Z/z,
          // increment the string (excluding the last Z/z) recursively,
          // and append A/a (depending on casing) to it
          return getNextKey(sub) + String.fromCharCode(lastChar.charCodeAt() - 25);
        } else {
          // (take till last char) append with (increment last char)
          return sub + String.fromCharCode(lastChar.charCodeAt() + 1);
        }
      }
      return key;
    };
    

    【讨论】:

    • 注意,您也可以在else{} 部分中使用key.substr(-1) 来获取最后一个字符,但它在IE 的JScript 中不起作用,它不接受substr() 的负索引.不过,我不确定新 Edge 浏览器是否支持...
    • 我发现 IE11 和 Edge 都支持substr() 中的负索引...似乎 IE10 也支持(通过更改 IE11 中的浏览器模式进行测试)
    • 这不会按照您承诺的顺序返回密钥。你答应了A B C ... Y Z AA AB ... AZ BA ... ZZ AAA 但它实际上返回了A B .. Y Z ZA ZB .. ZY ZZ ZZA ZZB .. ZZY ZZZ ZZZA ZZZB ...
    • @Wyck - 感谢您指出这一点,脚本错误。我已经修复了脚本。虽然我认为您的评论有点错误:该函数正在输出AA AB ... AZ A[,但它正确输出ZZA....ZZZ AAAA(至少从我的测试来看)
    【解决方案4】:

    这是一个功能相同的函数(除了大写字母,但很容易更改),但只使用一次 slice 并且是迭代的而不是递归的。在快速基准测试中,它的速度大约快了 4 倍(仅当您大量使用它时才有意义!)。

    function nextString(str) {
      if (! str)
        return 'A'  // return 'A' if str is empty or null
    
      let tail = ''
      let i = str.length -1
      let char = str[i]
      // find the index of the first character from the right that is not a 'Z'
      while (char === 'Z' && i > 0) {
        i--
        char = str[i]
        tail = 'A' + tail   // tail contains a string of 'A'
      }
      if (char === 'Z') // the string was made only of 'Z'
        return 'AA' + tail
      // increment the character that was not a 'Z'
      return str.slice(0, i) + String.fromCharCode(char.charCodeAt(0) + 1) + tail
    }
    

    【讨论】:

      【解决方案5】:

      只是为了解释 Bipul Yadav 编写的代码的主要部分(由于缺乏代表,目前无法评论)。不考虑循环,仅以字符“a”为例:

      "a".charCodeAt(0) = 97...因此 "a".charCodeAt(0) + 1 = 98String.fromCharCode (98) = "b"...所以任何字母的以下函数将返回字母表中的下一个字母:

      function nextLetterInAlphabet(letter) {
        if (letter == "z") {
          return "a";
        } else if (letter == "Z") {
          return "A";
        } else {
          return String.fromCharCode(letter.charCodeAt(0) + 1);
        }
      }
      

      【讨论】:

        【解决方案6】:
        var input = "Hello";
        var result = ""
        for(var i=0;i<input.length;i++)
        {
          var curr = String.fromCharCode(input.charCodeAt(i)+1);
          result = result +curr;
        }
        console.log(result);
        

        【讨论】:

        • 请添加一些解释,说明为什么这个答案有用以及它是如何工作的。仅代码答案的价值很低,尤其是从长远来看。假设读者没有你知道的那么多,因此无法理解你的代码。
        【解决方案7】:

        我知道最初的问题是将字符串的最后一个字母向前移动到下一个字母。但是我个人更感兴趣的是更改字符串中的所有字母,然后能够撤消它。因此,我采用了 Bipul Yadav 编写的代码,并添加了更多代码。下面的代码采用一系列字母,将每个字母递增到下一个字母保持大小写(并使 Zz 变为 Aa),然后将它们回滚到前一个字母(并允许 Aa 回到 Zz)。

        var inputValue = "AaZzHello";
        console.log( "starting value=[" + inputValue + "]" );
        
        var resultFromIncrementing = ""
        for( var i = 0; i < inputValue.length; i++ ) {
            var curr = String.fromCharCode( inputValue.charCodeAt(i) + 1 );
            if( curr == "[" ) curr = "A";
            if( curr == "{" ) curr = "a";
            resultFromIncrementing = resultFromIncrementing + curr;
        }
        console.log( "resultFromIncrementing=[" + resultFromIncrementing + "]" );
        
        inputValue = resultFromIncrementing;
        var resultFromDecrementing = "";
        for( var i2 = 0; i2 < inputValue.length; i2++ ) {
            var curr2 = String.fromCharCode( inputValue.charCodeAt(i2) - 1 );
            if( curr2 == "@" ) curr2 = "Z";
            if( curr2 == "`" ) curr2 = "z";
            resultFromDecrementing = resultFromDecrementing + curr2;
        }
        console.log( "resultFromDecrementing=[" + resultFromDecrementing + "]" );
        

        这个输出是:

        starting value=[AaZzHello]
        resultFromIncrementing=[BbAaIfmmp]
        resultFromDecrementing=[AaZzHello]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-23
          • 1970-01-01
          • 1970-01-01
          • 2011-02-10
          • 2012-05-05
          • 1970-01-01
          • 1970-01-01
          • 2011-01-29
          相关资源
          最近更新 更多