誰かが文字をインクリメントする方法を提供するJavascriptライブラリ(アンダースコア、jQuery、MooToolsなど)を知っていますか?
私は次のようなことをできるようにしたいと思います:
"a"++; // would return "b"
function nextChar(c) {
return String.fromCharCode(c.charCodeAt(0) + 1);
}
nextChar('a');
他の人が指摘したように、欠点は文字「z」のようなケースを期待どおりに処理できない可能性があることです。しかし、それはあなたがそれから何を望むかに依存します。上記のソリューションは、 'z'の後の文字に対して '{'を返します。これはASCIIの 'z'の後の文字であるため、ユースケースによっては探している結果になる可能性があります。
(2019/05/09更新)
この回答は非常に多くの可視性を得たので、Googleからこれにつまずいている人々を潜在的に助けるために、元の質問の範囲を少し超えて拡大することにしました。
私がよく欲しいのは、特定の文字セットで連続した一意の文字列を生成するもの(文字のみを使用するなど)であることがわかったため、この回答を更新して、ここでそれを行うクラスを含めました。
class StringIdGenerator {
constructor(chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
this._chars = chars;
this._nextId = [0];
}
next() {
const r = [];
for (const char of this._nextId) {
r.unshift(this._chars[char]);
}
this._increment();
return r.join('');
}
_increment() {
for (let i = 0; i < this._nextId.length; i++) {
const val = ++this._nextId[i];
if (val >= this._chars.length) {
this._nextId[i] = 0;
} else {
return;
}
}
this._nextId.Push(0);
}
*[Symbol.iterator]() {
while (true) {
yield this.next();
}
}
}
使用法:
const ids = new StringIdGenerator();
ids.next(); // 'a'
ids.next(); // 'b'
ids.next(); // 'c'
// ...
ids.next(); // 'z'
ids.next(); // 'A'
ids.next(); // 'B'
// ...
ids.next(); // 'Z'
ids.next(); // 'aa'
ids.next(); // 'ab'
ids.next(); // 'ac'
プレーンjavascriptがトリックを行うはずです:
String.fromCharCode('A'.charCodeAt() + 1) // Returns B
指定された文字がzの場合はどうなりますか?これがより良い解決策です。 A、B、C ... X、Y、Z、AA、ABなどになります。基本的には、Excelスプレッドシートの列IDのような文字をインクリメントします。
nextChar( 'yz'); //「ZA」を返します
function nextChar(c) {
var u = c.toUpperCase();
if (same(u,'Z')){
var txt = '';
var i = u.length;
while (i--) {
txt += 'A';
}
return (txt+'A');
} else {
var p = "";
var q = "";
if(u.length > 1){
p = u.substring(0, u.length - 1);
q = String.fromCharCode(p.slice(-1).charCodeAt(0));
}
var l = u.slice(-1).charCodeAt(0);
var z = nextLetter(l);
if(z==='A'){
return p.slice(0,-1) + nextLetter(q.slice(-1).charCodeAt(0)) + z;
} else {
return p + z;
}
}
}
function nextLetter(l){
if(l<90){
return String.fromCharCode(l + 1);
}
else{
return 'A';
}
}
function same(str,char){
var i = str.length;
while (i--) {
if (str[i]!==char){
return false;
}
}
return true;
}
// below is simply for the html sample interface and is unrelated to the javascript solution
var btn = document.getElementById('btn');
var entry = document.getElementById('entry');
var node = document.createElement("div");
node.id = "node";
btn.addEventListener("click", function(){
node.innerHTML = '';
var textnode = document.createTextNode(nextChar(entry.value));
node.appendChild(textnode);
document.body.appendChild(node);
});
<input id="entry" type="text"></input>
<button id="btn">enter</button>
文字のシーケンスを複数回使用する必要があったため、このSOの質問に基づいてこの関数を作成しました。これが他の人の助けになることを願っています。
function charLoop(from, to, callback)
{
var i = from.charCodeAt(0);
var to = to.charCodeAt(0);
for(;i<=to;i++) callback(String.fromCharCode(i));
}
それを使用する方法:
charLoop("A", "K", function(char) {
//char is one letter of the sequence
});
これを試すことができます
console.log( 'a'.charCodeAt(0))
最初にそれをアスキー番号に変換します..インクリメントします..次にアスキーから文字に変換します..
var nex = 'a'.charCodeAt(0);
console.log(nex)
$('#btn1').on('click', function() {
var curr = String.fromCharCode(nex++)
console.log(curr)
});
可能な方法の1つは、以下に定義されているとおりです。
function incrementString(value) {
let carry = 1;
let res = '';
for (let i = value.length - 1; i >= 0; i--) {
let char = value.toUpperCase().charCodeAt(i);
char += carry;
if (char > 90) {
char = 65;
carry = 1;
} else {
carry = 0;
}
res = String.fromCharCode(char) + res;
if (!carry) {
res = value.substring(0, i) + res;
break;
}
}
if (carry) {
res = 'A' + res;
}
return res;
}
console.info(incrementString('AAA')); // will print AAB
console.info(incrementString('AZA')); // will print AZB
console.info(incrementString('AZ')); // will print BA
console.info(incrementString('AZZ')); // will print BAA
console.info(incrementString('ABZZ')); // will print ACAA
console.info(incrementString('BA')); // will print BB
console.info(incrementString('BAB')); // will print BAC
// ... and so on ...
これらすべての答えを追加する:
// first code on page
String.prototype.nextChar = function(i) {
var n = i | 1;
return String.fromCharCode(this.charCodeAt(0) + n);
}
String.prototype.prevChar = function(i) {
var n = i | 1;
return String.fromCharCode(this.charCodeAt(0) - n);
}
これはうまく機能します:
var nextLetter = letter => {
let charCode = letter.charCodeAt(0);
let isCapital = letter == letter.toUpperCase();
if (isCapital == true) {
return String.fromCharCode((charCode - 64) % 26 + 65)
} else {
return String.fromCharCode((charCode - 96) % 26 + 97)
}
}
EXAMPLES
nextLetter("a"); // returns 'b'
nextLetter("z"); // returns 'a'
nextLetter("A"); // returns 'B'
nextLetter("Z"); // returns 'A'
笑いのためのソリューション
function nextLetter(str) {
const Alphabet = [
// lower case alphabet
"a", "b", "c",
"d", "e", "f",
"g", "h", "i",
"j", "k", "l",
"m", "n", "o",
"p", "q", "r",
"s", "t", "u",
"v", "w", "x",
"y", "z",
// upper case alphabet
"A", "B", "C",
"D", "E", "F",
"G", "H", "I",
"J", "K", "L",
"M", "N", "O",
"P", "Q", "R",
"S", "T", "U",
"V", "W", "X",
"Y", "Z"
];
const LetterArray = str.split("").map(letter => {
if (Alphabet.includes(letter) === true) {
return Alphabet[Alphabet.indexOf(letter) + 1];
} else {
return " ";
}
});
const Assemble = () => LetterArray.join("").trim();
return Assemble();
}
console.log(nextLetter("hello*3"));
クロージャに{a: 'b'、b: 'c'など}を指定して関数を作成します。
_let nextChar = (s => (
"abcdefghijklmopqrstuvwxyza".split('')
.reduce((a,b)=> (s[a]=b, b)), // make the lookup
c=> s[c] // the function returned
))({}); // parameter s, starts empty
_
使用法:-
_nextChar('a')
_
大文字と数字の追加:-
_let nextCh = (
(alphabeta, s) => (
[alphabeta, alphabeta.toUpperCase(), "01234567890"]
.forEach(chars => chars.split('')
.reduce((a,b) => (s[a]=b, b))),
c=> s[c]
)
)("abcdefghijklmopqrstuvwxyza", {});
_
追伸JavaScriptの一部のバージョンでは、chars.split('')
の代わりに_[...chars]
_を使用できます
これは本当に古いです。しかし、私はこの機能を必要としていたので、ユースケースに最適なソリューションはありませんでした。 a、b、c ... z、aa、ab ... zz、aaa ...を生成したかった。この単純な再帰が仕事をします。
function nextChar(str) {
if (str.length == 0) {
return 'a';
}
var charA = str.split('');
if (charA[charA.length - 1] === 'z') {
return nextID(str.substring(0, charA.length - 1)) + 'a';
} else {
return str.substring(0, charA.length - 1) +
String.fromCharCode(charA[charA.length - 1].charCodeAt(0) + 1);
}
};
https://stackoverflow.com/a/28490254/881441 で提出したrot13アルゴリズムのバリエーションを次に示します。
function rot1(s) {
return s.replace(/[A-Z]/gi, c =>
"BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza"[
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(c) ] )
}
下部の入力コードと検索されたコーデックは上部にあります(つまり、出力コードは入力コードと同じですが、1シフトされています)。この関数は文字のみを変更します。つまり、他の文字が渡された場合、このコーデックでは変更されません。