我正在构建一个自动填充功能,可以搜索CouchDB View。
我需要能够获取输入字符串的最后一个字符,并将最后一个字符替换为英文字母的下一个字母。 (这里不需要i18n)
例如:
OR
(如果您想知道,我确保包含选项inclusive_end=false
,以便此额外字符不会污染我的结果集)
indexOf()
这样的基本字符串来完成自己的花哨功能吗?答案 0 :(得分:40)
my_string.substring(0, my_string.length - 1)
+ String.fromCharCode(my_string.charCodeAt(my_string.length - 1) + 1)
答案 1 :(得分:25)
//这将返回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);
}
});
}
答案 2 :(得分:14)
一个更全面的解决方案,根据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;
};
答案 3 :(得分: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
}
答案 4 :(得分:1)
仅说明Bipul Yadav编写的代码的主要部分(由于缺少代表而无法发表评论)。不考虑循环,仅以字符“ a”为例:
“ a” .charCodeAt(0)= 97 ...因此,“ a” .charCodeAt(0)+ 1 = 98 和 String.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);
}
}
答案 5 :(得分:0)
我知道最初的问题是关于将字符串的最后一个字母移到下一个字母。但是我个人更感兴趣的是更改字符串中的所有字母,然后可以撤消该问题。因此,我采用了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]
答案 6 :(得分:-1)
lat <- fill_lat_na(as.matrix(dfmat))