代码之家  ›  专栏  ›  技术社区  ›  Dominic Barnes

如何在Javascript中获得字母表的下一个字母?

  •  27
  • Dominic Barnes  · 技术社区  · 16 年前

    我建立了一个自动完成搜索一个CouchDB视图。

    我需要能够获得输入字符串的最后一个字符,并用英语字母表的下一个字母替换最后一个字符(这里不需要i18n)

    例如:

    • 输入字符串 =“b”
    • =“b”
    • 结束键

    • 输入字符串 =“foo”
    • 开始键 =“foo”
    • =“fop”

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


    问题

    • 或者我只需要吸收它,用一个基本字符串,比如“abc…xyz”和 indexOf() ?
    4 回复  |  直到 16 年前
        1
  •  54
  •   Alexis Wilke    7 年前
    my_string.substring(0, my_string.length - 1)
          + String.fromCharCode(my_string.charCodeAt(my_string.length - 1) + 1)
    
        2
  •  30
  •   kennebec    16 年前

    //这将返回A代表Z,A代表Z。

    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);
            }
        });
    }
    
        3
  •  17
  •   kumarharsh    9 年前

    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;
    };
    
        4
  •  5
  •   vogomatix    5 年前

    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
  •  2
  •   Mahan Mashoof    6 年前

    只是为了解释bipulyadav编写的代码的主要部分(由于缺少代表,还不能发表评论)。不考虑循环,以字符“a”为例:

    “a”.charCodeAt(0)+1=98 …因此,任何字母的以下函数都将返回字母表中的下一个字母:

    function nextLetterInAlphabet(letter) {
      if (letter == "z") {
        return "a";
      } else if (letter == "Z") {
        return "A";
      } else {
        return String.fromCharCode(letter.charCodeAt(0) + 1);
      }
    }
    
        6
  •  0
  •   Bipul Yadav    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
  •  0
  •   StackOverflowUser    5 年前

    我知道最初的问题是关于将字符串的最后一个字母向前移动到下一个字母。但对于这个问题,我个人更感兴趣的是改变字符串中的所有字母,然后能够撤销它。所以我采用了bipulyadav编写的代码,并添加了更多的代码。下面的代码获取一系列字母,将每个字母递增到下一个字母大小写(并使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]