Phương thức có thể được sử dụng để tăng các chữ cái là gì?


98

Có ai biết về một thư viện Javascript (ví dụ: gạch dưới, jQuery, MooTools, v.v.) cung cấp một phương pháp tăng một ký tự không?

Tôi muốn có thể làm điều gì đó như:

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

Tôi không chắc cú pháp bạn đang tìm là có thể thực hiện được, nhưng hoạt động có thể thực hiện được thông qua các phương thức.
anson

Ứng dụng là gì?
valentinas

Câu trả lời:


177

Giải pháp đơn giản, trực tiếp

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

Như những người khác đã lưu ý, nhược điểm là nó có thể không xử lý các trường hợp như chữ 'z' như mong đợi. Nhưng nó phụ thuộc vào những gì bạn muốn từ nó. Giải pháp trên sẽ trả về '{' cho ký tự sau 'z' và đây là ký tự sau 'z' trong ASCII, vì vậy nó có thể là kết quả bạn đang tìm tùy thuộc vào trường hợp sử dụng của bạn.


Trình tạo chuỗi duy nhất

(Cập nhật 2019/05/09)

Vì câu trả lời này đã nhận được rất nhiều khả năng hiển thị nên tôi đã quyết định mở rộng nó ra ngoài phạm vi của câu hỏi ban đầu một chút để có thể giúp những người đang gặp khó khăn về vấn đề này từ Google.

Tôi thấy rằng những gì tôi thường muốn là thứ gì đó sẽ tạo ra các chuỗi tuần tự, duy nhất trong một bộ ký tự nhất định (chẳng hạn như chỉ sử dụng các chữ cái), vì vậy tôi đã cập nhật câu trả lời này để bao gồm một lớp sẽ làm điều đó ở đây:

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

Sử dụng:

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'

Giải pháp đơn giản, nhưng không xử lý sự xuất hiện của 'z' hoặc 'Z'.
Trent

3
loại một buzzkill rằng nó sẽ đi vào ký tự đặc biệt thích /
Daniel Thompson

Chính xác những gì tôi đang tìm kiếm khi tôi đang cố gắng xem qua và chọn ra các ký tự unicode không hiển thị cho một phông chữ IBM Code Page 437 cũ. Bạn thực sự vừa tiết kiệm cho tôi hàng giờ gõ ký tự.
LeftOnTheMoon

1
Daniel Thompson giải pháp này cung cấp quá đủ thông tin, bạn có thể tự xử lý các trường hợp góc. Rốt cuộc, đây là một trang web "giúp đỡ lẫn nhau", không làm công việc của tôi cho trang web miễn phí.
Bojidar Stanchev

Tôi đã mất một lúc để tìm cách đặt ký tự Bắt đầu trở thành một đối số. Tôi đã kết thúc bằng cách sử dụng ._nextId = [chars.split (''). FindIndex (x => x == start)]; Hoặc bắt đầu +1 nếu bạn muốn nó bắt đầu 1 nhiều hơn những gì bạn đã vượt qua.
JohnDavid

49

Javascript thuần nên thực hiện thủ thuật:

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

1
Pure Charm, bất kỳ gợi ý nào về việc tránh các khoảng trắng và các ký tự đặc biệt. coderByte có một câu hỏi về vấn đề này
sg28

22

Nếu chữ cái đã cho là z thì sao? Đây là một giải pháp tốt hơn. Nó đi A, B, C ... X, Y, Z, AA, AB, ... vv Về cơ bản, nó tăng các chữ cái giống như ID cột của bảng tính Excel.

nextChar ('yz'); // trả về "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>


Đã thay đổi if (same(u,'Z')){thành if (u == 'Z'){và nó hoạt động hoàn hảo, cảm ơn!
Sean Kendle

Rất vui vì nó hoạt động và cảm ơn vì phản hồi. Có thể lỗi ban đầu đó là bcs chức năng có tiêu đề same(str,char)không được dán vào đó? Tôi không biết.
Ronnie Royston

Gotta là trường hợp, same()rõ ràng là một chức năng tùy chỉnh. Ồ, ==hoạt động tốt, và nếu tôi muốn cực kỳ chắc chắn, tôi có thể sử dụng ===, nhưng tôi đã thử nghiệm nó, và nó ổn. Cảm ơn một lần nữa!
Sean Kendle

Nếu bạn gõ zz bạn sẽ nhận được ba chữ A có phải là lỗi trong mã không ??
Amr Ashraf

1
tôi không nghĩ vậy? cái gì đến sau zz? aaa phải không? Tôi chưa cài đặt excel trên máy này (để kiểm tra lại) nhưng nó có vẻ phù hợp với tôi.
Ronnie Royston

5

Một cách khả thi có thể được định nghĩa dưới đây

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

Bạn có thể thử cái này

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

Đầu tiên chuyển nó thành số Ascii .. Tăng nó lên .. sau đó chuyển từ Ascii sang char ..

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

Kiểm tra FIDDLE


1
Hừ! Cần thêm jQuery.
Jasper

4

Tôi cần sử dụng chuỗi các chữ cái nhiều lần và vì vậy tôi đã tạo hàm này dựa trên câu hỏi SO này. Tôi hy vọng điều này có thể giúp những người khác.

function charLoop(from, to, callback)
{
    var i = from.charCodeAt(0);
    var to = to.charCodeAt(0);
    for(;i<=to;i++) callback(String.fromCharCode(i));
}
  • từ - bắt đầu chữ cái
  • đến - chữ cái cuối cùng
  • callback (letter) - hàm thực thi cho từng chữ cái trong chuỗi

Làm thế nào để sử dụng nó:

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

Xem bản demo hoạt động này


3

Thêm vào tất cả những câu trả lời sau:

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

Ví dụ: http://jsfiddle.net/pitaj/3F5Qt/


2

Cái này hoạt động tốt:

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

Một giải pháp chỉ để gây cười

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

Điều này thực sự cũ. Nhưng tôi cần chức năng này và không có giải pháp nào là tối ưu cho trường hợp sử dụng của tôi. Tôi muốn tạo a, b, c ... z, aa, ab ... zz, aaa .... Đệ quy đơn giản này thực hiện công việc.

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

Tạo một hàm với {a: 'b', b: 'c', etc} trong một bao đóng: -

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

sử dụng:-

nextChar('a')

Thêm chữ hoa và chữ số: -

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

ps Trong một số phiên bản của Javascript, bạn có thể sử dụng [...chars]thay vìchars.split('')



0

Đây là một biến thể của thuật toán rot13 mà tôi đã gửi trên https://stackoverflow.com/a/28490254/881441 :

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

Mã đầu vào ở dưới cùng và codec tra cứu ở trên cùng (tức là mã đầu ra giống với mã đầu vào nhưng dịch chuyển 1). Hàm chỉ thay đổi các chữ cái, tức là nếu bất kỳ ký tự nào khác được truyền vào, nó sẽ không thay đổi bởi codec này.


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
Bạn có thể muốn giải thích chính xác những gì bạn đã làm ở đây và nó giúp ích như thế nào hơn là chỉ có một khối mã, cảm ơn! - Có lẽ một số cmoments hữu ích trong mã?
Mark Davies

String.fromCharCode () nó trả về mã char của chữ cái.
LokeshKumar

0

Dựa trên sự tăng và giảm câu trả lời trên tường @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;
  }
    
}

Sử dụng

const ids = new StringIdGenerator();

ids.next(); 
ids.prev();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.