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


99

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

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

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

Я не уверен, что синтаксис, который вы ищете, возможен, но операция возможна с помощью методов.
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/


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'

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

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('')



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();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.