web-dev-qa-db-ja.com

文字をインクリメントするために使用できる方法は何ですか?

誰かが文字をインクリメントする方法を提供するJavascriptライブラリ(アンダースコア、jQuery、MooToolsなど)を知っていますか?

私は次のようなことをできるようにしたいと思います:

"a"++; // would return "b"
87
andyzinsser

シンプルで直接的なソリューション

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'
153
Nathan Wall

プレーンjavascriptがトリックを行うはずです:

String.fromCharCode('A'.charCodeAt() + 1) // Returns B
43
Zar

指定された文字が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>
19
Ron Royston

文字のシーケンスを複数回使用する必要があったため、このSOの質問に基づいてこの関数を作成しました。これが他の人の助けになることを願っています。

function charLoop(from, to, callback)
{
    var i = from.charCodeAt(0);
    var to = to.charCodeAt(0);
    for(;i<=to;i++) callback(String.fromCharCode(i));
}
  • from-開始文字
  • to-最後の文字
  • callback(letter)-シーケンス内の各文字に対して実行する関数

それを使用する方法:

charLoop("A", "K", function(char) {
    //char is one letter of the sequence
});

この作業デモを参照

4
letiagoalves

これを試すことができます

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)
});

確認 [〜#〜] fiddle [〜#〜]

4
Sushanth --

可能な方法の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 ...

3
Sandeep Singh

これらすべての答えを追加する:

// 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);
}

例: http://jsfiddle.net/pitaj/3F5Qt/

3
PitaJ

これはうまく機能します:

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'
1
NikK

笑いのためのソリューション

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"));
1
dean schmid

クロージャに{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]_を使用できます

0
Quentin 2

これは本当に古いです。しかし、私はこの機能を必要としていたので、ユースケースに最適なソリューションはありませんでした。 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);
}
};
0
mrtyormaa

https://stackoverflow.com/a/28490254/881441 で提出したr​​ot13アルゴリズムのバリエーションを次に示します。

function rot1(s) {
  return s.replace(/[A-Z]/gi, c =>
    "BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza"[
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(c) ] )
}

下部の入力コードと検索されたコーデックは上部にあります(つまり、出力コードは入力コードと同じですが、1シフトされています)。この関数は文字のみを変更します。つまり、他の文字が渡された場合、このコーデックでは変更されません。

0
Stephen Quan