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

99

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

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

"a"++; // would return "b"
Andyzinsser
источник
Я не уверен, что синтаксис, который вы ищете, возможен, но операция возможна с помощью методов.
anson
Какое приложение?
valentinas

Ответы:

179

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

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'
Натан Уолл
источник
Простое решение, но не обрабатывает появление «z» или «Z».
Трент
3
своего рода жульничество, что он войдет в специальные символы, такие как /
Дэниел Томпсон
Именно то, что я искал, когда пытался пройти и выбрать не отображаемые символы Юникода для шрифта старой школы IBM Code Page 437. Вы буквально только что сэкономили мне часы набора символов.
LeftOnTheMoon
1
Дэниел Томпсон: это решение предоставляет более чем достаточно информации, вы можете справиться с трудностями самостоятельно. В конце концов, это сайт "помощи друг другу", а не бесплатный сайт, который мне нужен.
Божидар Станчев
Мне потребовалось время, чтобы понять, как сделать начальный символ аргументом. В итоге я использовал ._nextId = [chars.split (''). FindIndex (x => x == start)]; Или начните +1, если хотите, чтобы оно начиналось на 1 больше, чем вы передали.
Джон Дэвид,
49

Обычный javascript должен помочь:

String.fromCharCode('A'.charCodeAt() + 1) // Returns B
Зар
источник
1
Pure Charm, любые предложения по избежанию пробелов и специальных символов. У coderByte есть вопрос по этому
поводу
22

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

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>

Ронни Ройстон
источник
1
Поменял if (same(u,'Z')){на if (u == 'Z'){и работает отлично, спасибо!
Шон Кендл
Рад, что это сработало, и спасибо за отзывы. Может быть, эта первоначальная ошибка была там, потому что функция с названием same(str,char)не была вставлена ​​туда? Понятия не имею.
Ронни Ройстон
Должно быть, same()это явно настраиваемая функция. Да ладно, ==работает, и если бы я хотел быть супер уверенным, я мог бы использовать ===, но я протестировал его, и все в порядке. Еще раз спасибо!
Шон Кендл,
если вы наберете zz, вы получите тройной А, это ошибка в коде ??
Амр Ашраф
1
я так не думаю? что идет после zz? ааа верно? У меня нет установленного Excel на этой машине (чтобы дважды проверить), но мне это кажется правильным.
Ронни Ройстон
5

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

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

Сандип Сингх
источник
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

Сушант -
источник
1
Хм. Требуется больше jQuery.
Джаспер,
4

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

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

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

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

Летиагоалвес
источник
3

Добавляя ко всем этим ответам:

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

PitaJ
источник
2

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

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'
NikK
источник
1

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

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

Дин Шмид
источник
0

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

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

Квентин 2
источник
0

Вот вариант алгоритма rot13, который я представил на https://stackoverflow.com/a/28490254/881441 :

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

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

Стивен Куан
источник
0

function charLoop(from, to, callback) {
    var i = from.charCodeAt(0);
    var to = to.charCodeAt(0);
    for (; i <= to; i++) {
        callback(String.fromCharCode(i));
    }
}

var sequence = "";
charLoop("A", "Z", function (char) {
    sequence += char + " ";
});

sequence = sequence.trim();
sequence = sequence.split(" ");

var resseq = sequence;
var res = "";
var prevlet = "";
var nextlet = "";

for (b = 0; b < resseq.length; b++) {
    if (prevlet != "") {
        prevlet = resseq[b];
    }

    for (a = 0; a < sequence.length; a++) {
        for (j = 1; j < 100; j++) {
            if (prevlet == "") {
                prevlet = sequence[a];
                nextlet = sequence[a + 1];
                res += sequence[a] + sequence[a] + 0 + j + " ";
            }
            else {

                if (j < 10) {
                    res += prevlet + sequence[a] + 0 + j + " ";
                }
                else {
                    res += prevlet + sequence[a] + j + " ";
                }
            }
        }
    }
}

document.body.innerHTML = res;
ЛокешКумар
источник
1
Вы можете объяснить, что именно вы здесь сделали и как это помогает, а не просто блок кода, спасибо! - Может быть, какие-нибудь полезные моменты в коде?
Марк Дэвис,
String.fromCharCode () возвращает символьный код буквы.
LokeshKumar
0

На основе приращения и уменьшения ответа @Nathan wall

// Albhabet auto increment and decrement
class StringIdGenerator {
    constructor(chars = '') {
      this._chars = chars;
    }

  next() {
    var u = this._chars.toUpperCase();
    if (this._same(u,'Z')){
        var txt = '';
        var i = u.length;
        while (i--) {
            txt += 'A';
        }
        this._chars = 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 = this._nextLetter(l);
      if(z==='A'){
        this._chars = p.slice(0,-1) + this._nextLetter(q.slice(-1).charCodeAt(0)) + z;
          return p.slice(0,-1) + this._nextLetter(q.slice(-1).charCodeAt(0)) + z;
      } else {
        this._chars = p+z;
          return p + z;
      }
    }
  }

  prev() {
    var u = this._chars.toUpperCase();
    console.log("u "+u)
    var l = u.slice(-1).charCodeAt(0);
    var z = this._nextLetter(l);
    var rl = u.slice(1)
    var y = (rl == "A") ? "Z" :this._prevLetter(rl.charCodeAt(0))
      var txt = '';
      var i = u.length;
      var j = this._chars
      var change = false
      while (i--) {
        if(change){
          if (u[u.length-1] == "A"){
            txt += this._prevLetter(u[i].charCodeAt(0))
          }else{
            txt += u[i]
          }
          
        }else{
          if (u[u.length-1] == "A"){
            txt += this._prevLetter(u[i].charCodeAt(0))
            change = true
          }else{
            change = true
            txt += this._prevLetter(u[i].charCodeAt(0))
          }
        }
      }
      if(u == "A" && txt == "Z"){
        this._chars = ''
      }else{
        this._chars = this._reverseString(txt);
      }
      console.log(this._chars)
      return (j);
  }
  _reverseString(str) {
      return str.split("").reverse().join("");
  }
  _nextLetter(l){
      if(l<90){
          return String.fromCharCode(l + 1);
      }
      else{
          return 'A';
      }
  }

  _prevLetter(l){
    if(l<=90){
      if(l == 65) l = 91
        return String.fromCharCode(l-1);
    }
    else{
        return 'A';
    }
  }
  _same(str,char){
      var i = str.length;
      while (i--) {
          if (str[i]!==char){
              return false;
          }
      }
      return true;
  }
    
}

использование

const ids = new StringIdGenerator();

ids.next(); 
ids.prev();
Гаутам Сорьярадж
источник