Apa metode yang dapat digunakan untuk menaikkan huruf?


99

Adakah yang tahu tentang perpustakaan Javascript (misalnya garis bawah, jQuery, MooTools, dll.) Yang menawarkan metode untuk menaikkan huruf?

Saya ingin bisa melakukan sesuatu seperti:

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

Saya tidak yakin sintaks yang Anda cari dapat dilakukan, tetapi pengoperasian dapat dilakukan melalui metode.
Anson

Apa aplikasinya?
valentinas

Jawaban:


179

Solusi sederhana dan langsung

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

Seperti yang telah dicatat orang lain, kelemahannya adalah mungkin tidak menangani kasus seperti huruf 'z' seperti yang diharapkan. Tapi itu tergantung pada apa yang Anda inginkan darinya. Solusi di atas akan mengembalikan '{' untuk karakter setelah 'z', dan ini adalah karakter setelah 'z' di ASCII, jadi ini bisa menjadi hasil yang Anda cari tergantung pada kasus penggunaan Anda.


Generator string unik

(Diperbarui 2019/05/09)

Karena jawaban ini telah menerima begitu banyak visibilitas, saya memutuskan untuk memperluasnya sedikit di luar cakupan pertanyaan asli untuk berpotensi membantu orang yang tersandung pada ini dari Google.

Saya menemukan bahwa yang sering saya inginkan adalah sesuatu yang akan menghasilkan string berurutan dan unik dalam kumpulan karakter tertentu (seperti hanya menggunakan huruf), jadi saya telah memperbarui jawaban ini untuk memasukkan kelas yang akan melakukannya di sini:

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

Pemakaian:

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'

Solusi sederhana, tetapi tidak menangani terjadinya 'z' atau 'Z'.
Trent

3
semacam buzzkill yang akan menjadi karakter khusus seperti /
Daniel Thompson

Persis seperti yang saya cari ketika saya mencoba menelusuri dan memilih karakter unicode yang tidak ditampilkan ke font IBM Code Page 437 jadul. Anda benar-benar baru saja menyelamatkan saya berjam-jam mengetik karakter.
LeftOnTheMoon

1
Daniel Thompson, solusi ini memberikan lebih dari cukup informasi, Anda dapat menangani kasus sudut sendiri. Bagaimanapun, ini adalah situs web "saling membantu", bukan melakukan pekerjaan saya untuk situs web gratis.
Bojidar Stanchev

Butuh beberapa saat bagi saya untuk memikirkan bagaimana membuat karakter Awal menjadi argumen. Saya akhirnya menggunakan ._nextId = [chars.split (''). FindIndex (x => x == start)]; Atau mulai + 1 jika Anda ingin memulai 1 lebih banyak dari yang Anda berikan.
berikan JohnDavid

49

Javascript biasa harus melakukan trik:

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

1
Pure Charm, saran untuk menghindari spasi kosong dan karakter khusus. coderByte memiliki pertanyaan tentang ini
sg28

22

Bagaimana jika huruf yang diberikan adalah z? Ini solusi yang lebih baik. Bunyinya A, B, C ... X, Y, Z, AA, AB, ... dll. Pada dasarnya ini menambah huruf seperti ID kolom dari spreadsheet Excel.

nextChar ('yz'); // mengembalikan "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>


Berubah if (same(u,'Z')){menjadi if (u == 'Z'){dan berfungsi dengan sempurna, terima kasih!
Sean Kendle

Senang berhasil dan terima kasih atas umpan baliknya. Mungkin kesalahan awal itu apakah ada bcs fungsi berjudul same(str,char)tidak ditempel di sana? Saya tidak tahu.
Ronnie Royston

Harus demikian, same()jelas merupakan fungsi khusus. Baiklah, ==berhasil, dan jika saya ingin sangat yakin, saya bisa menggunakan ===, tapi saya sudah mengujinya, dan tidak apa-apa. Terima kasih lagi!
Sean Kendle

jika Anda mengetik zz Anda akan mendapatkan triple A apakah itu bug di kode ??
Amr Ashraf

1
menurutku tidak? apa yang terjadi setelah zz? aaa benar? Saya tidak memiliki excel yang diinstal pada mesin ini (untuk memeriksa ulang) tetapi kedengarannya benar bagi saya.
Ronnie Royston

5

Salah satu cara yang mungkin dapat dijelaskan di bawah ini

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

Anda bisa mencobanya

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

Konversikan dulu ke angka Ascii .. Tingkatkan .. lalu ubah dari Ascii ke char ..

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

Periksa FIDDLE


1
Hmm. Membutuhkan lebih banyak jQuery.
Jasper

4

Saya perlu menggunakan urutan huruf beberapa kali dan jadi saya membuat fungsi ini berdasarkan pertanyaan SO ini. Saya harap ini bisa membantu orang lain.

function charLoop(from, to, callback)
{
    var i = from.charCodeAt(0);
    var to = to.charCodeAt(0);
    for(;i<=to;i++) callback(String.fromCharCode(i));
}
  • dari - huruf awal
  • ke - surat terakhir
  • callback (huruf) - fungsi untuk menjalankan setiap huruf dalam urutan

Bagaimana cara menggunakannya:

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

Lihat demo kerja ini


3

Menambahkan semua jawaban ini:

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

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


2

Yang ini bekerja dengan baik:

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

Solusi hanya untuk tertawa

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

Ini sangat tua. Tetapi saya membutuhkan fungsionalitas ini dan tidak ada solusi yang optimal untuk kasus penggunaan saya. Saya ingin menghasilkan a, b, c ... z, aa, ab ... zz, aaa .... Rekursi sederhana ini berhasil.

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

Buat fungsi dengan {a: 'b', b: 'c', etc} dalam penutupan: -

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

pemakaian:-

nextChar('a')

Menambahkan huruf besar dan angka: -

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

ps Dalam beberapa versi dari Javascript, Anda dapat menggunakan [...chars]bukannyachars.split('')



0

Berikut adalah variasi dari algoritma rot13 yang saya kirimkan di https://stackoverflow.com/a/28490254/881441 :

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

Kode input di bagian bawah dan codec yang dicari ada di atas (yaitu kode output sama dengan kode input tetapi digeser 1). Fungsinya hanya mengubah huruf, yaitu jika ada karakter lain yang dilewatkan, itu tidak akan diubah oleh codec ini.


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
Anda mungkin ingin menjelaskan apa yang sebenarnya telah Anda lakukan di sini dan bagaimana hal itu membantu daripada hanya memiliki satu blok kode, terima kasih! - Mungkin beberapa cmoments berguna dalam kode?
Mark Davies

String.fromCharCode () mengembalikan kode karakter huruf.
LokeshKumar

0

Berdasarkan kenaikan dan penurunan jawaban dinding @Nathan

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

Pemakaian

const ids = new StringIdGenerator();

ids.next(); 
ids.prev();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.