Что такое метод, который можно использовать для увеличения букв?

Кто-нибудь знает библиотеку Javascript (например, underscore, jQuery, MooTools и т.д.), которая предлагает метод увеличения буквы?

Я хотел бы сделать что-то вроде:

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

Ответ 1

Простое, прямое решение

function nextChar(c) {
    return String.fromCharCode(c.charCodeAt(0) + 1);
}
nextChar('a');

Как уже отмечали другие, недостатком является то, что он может не обрабатывать такие случаи, как буква "z", как ожидалось. Но это зависит от того, что вы хотите от этого. Приведенное выше решение вернет '{' для символа после 'z', и это символ после 'z' в ASCII, так что это может быть результатом, который вы ищете, в зависимости от вашего варианта использования.


Уникальный генератор строк

(Обновлено 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'

Ответ 2

Обычный javascript должен сделать трюк:

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

Ответ 3

Что делать, если данное письмо является z? Вот лучшее решение. Он идет A, B, C... X, Y, Z, AA, AB,... и т.д. В основном он увеличивает буквы, такие как идентификатор столбца таблицы Excel.

nextChar ( 'уг');//возвращает "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>

Ответ 4

Вы можете попробовать это

console.log( 'a'.charCodeAt​(0))​

Сначала преобразуйте его в номер Ascii.. Увеличьте его.. затем конвертируйте из Ascii в char..

var nex = 'a'.charCodeAt(0);
console.log(nex)
$('#btn1').on('click', function() {
   var curr = String.fromCharCode(nex++)
   console.log(curr)
});

Отметьте FIDDLE

Ответ 5

Мне нужно было использовать последовательности букв несколько раз, и поэтому я сделал эту функцию на основе этого вопроса 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 - начать письмо
  • - последняя буква
  • функция обратного вызова (письма) - для каждой буквы в Последовательность

Как использовать его:

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

См. эту рабочую демонстрацию

Ответ 6

Добавление всех этих ответов:

// 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/

Ответ 7

Один из возможных способов может быть таким, как определено ниже

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 ...

Ответ 8

Это хорошо работает:

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'

Ответ 9

Решение просто для смеха

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

Ответ 10

Это действительно старый. Но мне нужна была эта функциональность, и ни одно из решений не было оптимальным для моего варианта использования. Я хотел сгенерировать 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);
}
};

Ответ 11

Создайте функцию с {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", {});

ps В некоторых версиях Javascript вы можете использовать [...chars] вместо chars.split('')

Ответ 12

Вот вариант алгоритма rot13, который я представил на fooobar.com/info/280700/...:

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

Входной код внизу и проверенный кодек находятся сверху (т.е. выходной код такой же, как входной код, но смещен на 1). Функция изменяет только буквы, т.е. Если передается любой другой символ, он не будет изменен этим кодеком.