web-dev-qa-db-fra.com

Comment obtenir la prochaine lettre de l'alphabet en Javascript?

Je construis une saisie semi-automatique qui recherche une vue CouchDB.

Je dois être capable de prendre le dernier caractère de la chaîne d'entrée et de remplacer le dernier caractère par la lettre suivante de l'alphabet anglais. (Pas besoin d'i18n ici)

Par exemple:

  • Chaîne d'entrée = "b"
  • touche de démarrage = "b"
  • touche finale = "c"

[~ # ~] ou [~ # ~]

  • Chaîne d'entrée = "foo"
  • touche de démarrage = "toto"
  • touche finale = "fop"

(au cas où vous vous poseriez la question, je m'assure d'inclure l'option inclusive_end=false afin que ce caractère supplémentaire ne ternisse pas mon jeu de résultats)


La question

  • Existe-t-il une fonction native en Javascript qui peut simplement obtenir la prochaine lettre de l'alphabet?
  • Ou aurai-je juste besoin de le sucer et de faire ma propre fonction fantaisie avec une chaîne de base comme "abc ... xyz" et indexOf()?
32
Dominic Barnes
my_string.substring(0, my_string.length - 1)
      + String.fromCharCode(my_string.charCodeAt(my_string.length - 1) + 1)
42
icktoofay

// Cela renverra A pour Z et a pour 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);
        }
    });
}
25
kennebec

Une solution plus complète, qui obtient la lettre suivante selon la façon dont MS Excel numérote ses colonnes ... A B C ... Y Z AA AB ... AZ BA ... ZZ AAA

Cela fonctionne avec les petites lettres, mais vous pouvez également l'étendre facilement pour les majuscules.

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;
};
15
kumarharsh

Voici une fonction qui fait la même chose (sauf pour les majuscules seulement, mais c'est facile à changer) mais n'utilise slice qu'une seule fois et est itérative plutôt que récursive. Dans un benchmark rapide, c'est environ 4 fois plus rapide (ce qui n'est pertinent que si vous en faites un usage très intensif!).

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
mbl
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
Bipul Yadav