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:
[~ # ~] ou [~ # ~]
(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)
indexOf()
?my_string.substring(0, my_string.length - 1)
+ String.fromCharCode(my_string.charCodeAt(my_string.length - 1) + 1)
// 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);
}
});
}
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;
};
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
}
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);