How to get the next letter of the alphabet in Javascript?

后端 未结 7 982
醉酒成梦
醉酒成梦 2021-01-03 18:20

I am build an autocomplete that searches off of a CouchDB View.

I need to be able to take the final character of the input string, and replace the last character wit

相关标签:
7条回答
  • 2021-01-03 18:34
    my_string.substring(0, my_string.length - 1)
          + String.fromCharCode(my_string.charCodeAt(my_string.length - 1) + 1)
    
    0 讨论(0)
  • 2021-01-03 18:45

    Here is a function that does the same thing (except for upper case only, but that's easy to change) but uses slice only once and is iterative rather than recursive. In a quick benchmark, it's about 4 times faster (which is only relevant if you make really heavy use of it!).

    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
    

    }

    0 讨论(0)
  • 2021-01-03 18:46

    A more comprehensive solution, which gets the next letter according to how MS Excel numbers it's columns... A B C ... Y Z AA AB ... AZ BA ... ZZ AAA

    This works with small letters, but you can easily extend it for caps too.

    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;
    };
    
    0 讨论(0)
  • 2021-01-03 18:47
    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);
    
    0 讨论(0)
  • 2021-01-03 18:51

    // This will return A for Z and a for 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);
            }
        });
    }
    
    0 讨论(0)
  • 2021-01-03 18:52

    I understand the original question was about moving the last letter of the string forward to the next letter. But I came to this question more interested personally in changing all the letters in the string, then being able to undo that. So I took the code written by Bipul Yadav and I added some more code. The below code takes a series of letters, increments each of them to the next letter maintaining case (and enables Zz to become Aa), then rolls them back to the previous letter (and allows Aa to go back to 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 + "]" );
    

    The output of this is:

    starting value=[AaZzHello]
    resultFromIncrementing=[BbAaIfmmp]
    resultFromDecrementing=[AaZzHello]
    
    0 讨论(0)
提交回复
热议问题