Was ist eine Methode, mit der Buchstaben erhöht werden können?


98

Kennt jemand eine Javascript-Bibliothek (z. B. Unterstrich, jQuery, MooTools usw.), die eine Methode zum Inkrementieren eines Buchstabens bietet?

Ich möchte in der Lage sein, etwas zu tun wie:

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

Ich bin nicht sicher, ob die gesuchte Syntax möglich ist, aber die Operation ist über Methoden möglich.
Anson

Was ist die Anwendung?
Valentinas

Antworten:


177

Einfache, direkte Lösung

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

Wie andere angemerkt haben, besteht der Nachteil darin, dass Fälle wie der Buchstabe 'z' möglicherweise nicht wie erwartet behandelt werden. Aber es kommt darauf an, was Sie davon wollen. Die obige Lösung gibt '{' für das Zeichen nach 'z' zurück, und dies ist das Zeichen nach 'z' in ASCII. Je nach Anwendungsfall kann dies das gewünschte Ergebnis sein.


Einzigartiger Stringgenerator

(Aktualisiert am 09.05.2019)

Da diese Antwort so viel Sichtbarkeit erhalten hat, habe ich beschlossen, sie etwas über den Rahmen der ursprünglichen Frage hinaus zu erweitern, um potenziell Menschen zu helfen, die von Google darauf stoßen.

Ich finde, dass ich oft etwas möchte, das sequentielle, eindeutige Zeichenfolgen in einem bestimmten Zeichensatz generiert (z. B. nur Buchstaben verwendet). Deshalb habe ich diese Antwort aktualisiert, um eine Klasse aufzunehmen, die dies hier tut:

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

Verwendung:

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'

Einfache Lösung, behandelt aber nicht das Auftreten von 'z' oder 'Z'.
Trent

3
eine Art Buzzkill, dass es in Sonderzeichen wie /
Daniel Thompson

Genau das, wonach ich gesucht habe, als ich versucht habe, nicht angezeigte Unicode-Zeichen für eine alte IBM Code-Schriftart auszuwählen. Sie haben mir buchstäblich nur Stunden beim Schreiben von Zeichen erspart.
LeftOnTheMoon

1
Daniel Thompson Diese Lösung bietet mehr als genug Informationen, Sie können die Eckfälle selbst bearbeiten. Immerhin ist dies eine "einander helfen" Website, nicht meine Arbeit für kostenlose Website.
Bojidar Stanchev

Ich habe eine Weile gebraucht, um herauszufinden, wie ich den Startcharakter zu einem Argument machen kann. Am Ende habe ich ._nextId = [chars.split (''). FindIndex (x => x == start)] verwendet. Oder starten Sie + 1, wenn Sie möchten, dass 1 mehr startet als Sie übergeben haben.
JohnDavid

49

Einfaches Javascript sollte den Trick machen:

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

1
Pure Charm, jeder Vorschlag zur Vermeidung von Leerzeichen und Sonderzeichen. coderByte hat eine Frage dazu
sg28

22

Was ist, wenn der angegebene Buchstabe z ist? Hier ist eine bessere Lösung. Es geht A, B, C ... X, Y, Z, AA, AB, ... usw. Grundsätzlich werden Buchstaben wie die Spalten-IDs einer Excel-Tabelle inkrementiert.

nextChar ('yz'); // gibt "ZA" zurück

    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>


Geändert if (same(u,'Z')){zu if (u == 'Z'){und es funktioniert perfekt, danke!
Sean Kendle

Ich bin froh, dass es funktioniert hat und danke für das Feedback. Vielleicht war dieser anfängliche Fehler da, weil die Funktion mit dem Titel same(str,char)dort nicht eingefügt wurde? Ich weiß nicht.
Ronnie Royston

Muss der Fall sein, same()ist eindeutig eine benutzerdefinierte Funktion. Na ==ja , funktioniert, und wenn ich super sicher sein wollte, könnte ich es verwenden ===, aber ich habe es getestet und es ist in Ordnung. Danke noch einmal!
Sean Kendle

Wenn Sie zz eingeben, erhalten Sie Triple A. Ist es ein Fehler im Code?
Amr Ashraf

1
Ich glaube nicht? was kommt nach zz? aaa richtig? Ich habe kein Excel auf diesem Computer installiert (um es noch einmal zu überprüfen), aber es klingt für mich richtig.
Ronnie Royston

5

Ein möglicher Weg könnte wie unten definiert sein

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

Sie können dies versuchen

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

Konvertieren Sie es zuerst in eine Ascii-Zahl. Inkrementieren Sie es. Konvertieren Sie es dann von Ascii in char.

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

Überprüfen Sie FIDDLE


1
Hmm. Benötigt mehr jQuery.
Jasper

4

Ich musste mehrere Buchstabenfolgen verwenden und habe diese Funktion basierend auf dieser SO-Frage erstellt. Ich hoffe das kann anderen helfen.

function charLoop(from, to, callback)
{
    var i = from.charCodeAt(0);
    var to = to.charCodeAt(0);
    for(;i<=to;i++) callback(String.fromCharCode(i));
}
  • von - Startbuchstabe
  • bis - letzter Brief
  • Rückruf (Buchstabe) - Funktion, die für jeden Buchstaben in der Sequenz ausgeführt wird

Wie man es benutzt:

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

Sehen Sie sich diese funktionierende Demo an


3

Fügen Sie all diese Antworten hinzu:

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

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


2

Dieser funktioniert gut:

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

Eine Lösung nur zum Lachen

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

Das ist wirklich alt. Aber ich brauchte diese Funktionalität und keine der Lösungen ist für meinen Anwendungsfall optimal. Ich wollte a, b, c ... z, aa, ab ... zz, aaa ... erzeugen. Diese einfache Rekursion erledigt den Job.

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

Erstellen Sie eine Funktion mit {a: 'b', b: 'c' usw.} in einem Abschluss: -

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

Verwendung:-

nextChar('a')

Hinzufügen von Großbuchstaben und Ziffern: -

let nextCh = (
    (alphabeta, s) => (
        [alphabeta, alphabeta.toUpperCase(), "01234567890"]
            .forEach(chars => chars.split('')
               .reduce((a,b) => (s[a]=b, b))), 
        c=> s[c] 
    )
)("abcdefghijklmopqrstuvwxyza", {});

ps In einigen Versionen von Javascript können Sie [...chars]anstelle von verwendenchars.split('')



0

Hier ist eine Variation des rot13-Algorithmus, den ich unter https://stackoverflow.com/a/28490254/881441 eingereicht habe :

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

Der Eingabecode unten und der nachgeschlagene Codec befinden sich oben (dh der Ausgabecode ist der gleiche wie der Eingabecode, jedoch um 1 verschoben). Die Funktion ändert nur Buchstaben, dh wenn ein anderes Zeichen übergeben wird, bleibt es von diesem Codec unverändert.


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
Vielleicht möchten Sie erklären, was genau Sie hier getan haben und wie es hilft, anstatt nur einen Codeblock zu haben, danke! - Vielleicht einige hilfreiche Elemente im Code?
Mark Davies

String.fromCharCode () gibt den Zeichencode des Buchstabens zurück.
LokeshKumar

0

Basierend auf @ Nathan Wand Antwort Inkrementieren und Dekrementieren

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

Verwendung

const ids = new StringIdGenerator();

ids.next(); 
ids.prev();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.