1. ホーム
  2. javascript

[解決済み] 文字数を増やす方法とは?

2022-08-10 03:22:22

質問

Javascriptのライブラリ(underscore、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'