วิธีการเพิ่มตัวอักษรคืออะไร?


104

มีใครรู้จักไลบรารี Javascript (เช่นขีดล่าง, jQuery, MooTools ฯลฯ ) ที่เสนอวิธีการเพิ่มตัวอักษรหรือไม่?

ฉันต้องการที่จะทำสิ่งต่างๆเช่น:

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

ฉันไม่แน่ใจว่าไวยากรณ์ที่คุณกำลังมองหานั้นเป็นไปได้ แต่สามารถดำเนินการได้ด้วยวิธีการ
anson

แอปพลิเคชันคืออะไร?
valentinas

คำตอบ:


184

วิธีแก้ปัญหาที่ง่ายและตรงประเด็น

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
เป็นที่ฮือฮาว่าจะมีตัวละครพิเศษเช่น /
Daniel Thompson

สิ่งที่ฉันกำลังมองหาในขณะที่ฉันพยายามดำเนินการและเลือกอักขระ Unicode ที่ไม่แสดงเป็นแบบอักษร IBM Code Page 437 แบบเก่า คุณเพิ่งช่วยฉันได้หลายชั่วโมงในการพิมพ์ตัวอักษร
LeftOnTheMoon

1
Daniel Thompson โซลูชันนี้ให้ข้อมูลมากเกินพอคุณสามารถจัดการกรณีที่มุมได้ด้วยตัวเอง ท้ายที่สุดนี่คือเว็บไซต์ "ช่วยเหลือซึ่งกันและกัน" ไม่ใช่งานของฉันสำหรับเว็บไซต์ฟรี
Bojidar Stanchev

ฉันใช้เวลาสักพักเพื่อหาวิธีทำให้ตัวละครเริ่มต้นเป็นอาร์กิวเมนต์ ฉันลงเอยด้วยการใช้. _nextId = [chars.split (''). findIndex (x => x == start)]; หรือเริ่ม +1 หากคุณต้องการให้เริ่ม 1 มากกว่าสิ่งที่คุณผ่านมา
JohnDavid

50

JavaScript ธรรมดาควรทำเคล็ดลับ:

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

1
Pure Charm ข้อเสนอแนะเกี่ยวกับการหลีกเลี่ยงพื้นที่สีขาวและอักขระพิเศษ coderByte มีคำถามเกี่ยวกับเรื่องนี้
sg28

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'){และทำงานได้อย่างสมบูรณ์ขอบคุณ!
Sean Kendle

ดีใจที่ได้ผลและขอบคุณสำหรับข้อเสนอแนะ บางทีข้อผิดพลาดเริ่มต้นอาจมี bcs ฟังก์ชันที่มีชื่อsame(str,char)ว่าไม่ได้วางไว้ในนั้น? ไม่รู้สินะ.
Ronnie Royston

ต้องเป็นกรณีที่same()ชัดเจนเป็นฟังก์ชันที่กำหนดเอง โอ้==ใช้ได้ผลและถ้าฉันอยากจะมั่นใจสุด ๆ ฉันก็ใช้ได้===แต่ฉันได้ทดสอบแล้วก็ใช้ได้ ขอบคุณอีกครั้ง!
Sean Kendle

ถ้าคุณพิมพ์ zz คุณจะได้ triple A เป็นบั๊กในโค้ดหรือไม่?
Amr Ashraf

1
ฉันไม่คิดอย่างนั้นเหรอ? เกิดอะไรขึ้นหลังจาก zz? aaa ใช่ไหม ฉันไม่ได้ติดตั้ง excel ในเครื่องนี้ (เพื่อตรวจสอบอีกครั้ง) แต่มันฟังดูดีสำหรับฉัน
Ronnie Royston

6

วิธีหนึ่งที่เป็นไปได้อาจเป็นไปตามที่กำหนดไว้ด้านล่าง

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 เป็นถ่าน ..

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

ตรวจสอบFIDDLE


1
อืม. ต้องการ jQuery มากขึ้น
Jasper

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));
}
  • จาก -จดหมายเริ่มต้น
  • ถึง -อักษรตัวสุดท้าย
  • callback (letter) -ฟังก์ชั่นเพื่อดำเนินการสำหรับตัวอักษรแต่ละตัวในลำดับ

วิธีใช้:

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', etc} ในการปิด: -

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
คุณอาจต้องการอธิบายว่าคุณได้ทำอะไรที่นี่และมันช่วยได้อย่างไรแทนที่จะมีเพียงบล็อกโค้ดขอบคุณ! - cmoments ที่เป็นประโยชน์บางอย่างในโค้ดหรือไม่?
Mark Davies

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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.