Harfleri artırmak için kullanılabilecek bir yöntem nedir?


104

Bir harfi büyütme yöntemi sunan bir Javascript kitaplığı (ör. Alt çizgi, jQuery, MooTools, vb.) Bilen var mı?

Şunun gibi bir şey yapabilmek isterim:

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

Aradığınız sözdiziminin mümkün olduğundan emin değilim , ancak işlem yöntemlerle mümkündür.
anson

Uygulama nedir?
valentinas

Yanıtlar:


184

Basit, doğrudan çözüm

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

Diğerlerinin de belirttiği gibi, dezavantajı, 'z' harfi gibi durumları beklendiği gibi ele alamayabilir. Ama ondan ne istediğine bağlı. Yukarıdaki çözüm, 'z'den sonraki karakter için' {'döndürecektir ve bu ASCII'de' z'den sonraki karakterdir, bu nedenle kullanım durumunuza bağlı olarak aradığınız sonuç bu olabilir.


Benzersiz dizi üreteci

(Güncellenme tarihi 2019/05/09)

Bu yanıt çok fazla görünürlük kazandığından, Google'dan bu konuda tökezleyen kişilere potansiyel olarak yardımcı olmak için, orijinal sorunun kapsamının biraz ötesine geçmeye karar verdim.

Sık sık istediğim şeyin, belirli bir karakter setinde (yalnızca harf kullanmak gibi) sıralı, benzersiz dizeler üretecek bir şey olduğunu buldum, bu yüzden bu yanıtı, burada bunu yapacak bir sınıfı içerecek şekilde güncelledim:

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

Kullanım:

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'

Basit çözüm, ancak 'z' veya 'Z' oluşumunu ele almıyor.
Trent

3
tür özel karakterler gireceği bir buzzkill ait / mi
Daniel Thompson

Tam olarak aradığım şey, eski usul bir IBM Code Page 437 yazı tipinde görüntülenmeyen unicode karakterleri seçmeye ve seçmeye çalışırken. Kelimenin tam anlamıyla beni saatlerce karakter yazmaktan kurtardın.
LeftOnTheMoon

1
Daniel Thompson bu çözüm gereğinden fazla bilgi sağlar, köşedeki davaları kendiniz halledebilirsiniz. Sonuçta, bu bir "birbirlerine yardım" web sitesidir, işimi ücretsiz web sitesi için yapmayın.
Bojidar Stanchev

Başlangıç ​​karakterini nasıl bir argüman haline getireceğimi anlamam biraz zaman aldı. ._NextId = [chars.split (''). FindIndex (x => x == start)]; Veya + 1'i, geçtiğinizden 1 tane daha başlamasını istiyorsanız, + 1'i başlatın.
JohnDavid

50

Düz javascript hile yapmalı:

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

1
Saf Cazibe, beyaz boşluklardan ve özel karakterlerden kaçınmak için herhangi bir öneri. coderByte'ın bununla ilgili bir sorusu var
sg28

22

Ya verilen harf z ise? İşte daha iyi bir çözüm. A, B, C ... X, Y, Z, AA, AB, ... vb. Gider. Temelde bir Excel elektronik tablosunun sütun kimlikleri gibi harfleri artırır.

nextChar ('yz'); // "ZA" döndürür

    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
Değişti if (same(u,'Z')){için if (u == 'Z'){, ve o inşaat mükemmel teşekkürler!
Sean Kendle

Çalıştığına sevindim ve geri bildiriminiz için teşekkürler. Belki de ilk hata, başlıklı işlevin same(str,char)buraya yapıştırılmamış olmasıydı? Bilmiyorum.
Ronnie Royston

Durum böyle olmalı same(), açıkça özel bir işlev. Oh iyi, ==işe yarıyor ve çok emin olmak istersem kullanabilirdim ===, ama test ettim ve sorun değil. Tekrar teşekkürler!
Sean Kendle

zz yazarsanız üçlü A alırsınız bu kodda bir hata mı?
Amr Ashraf

1
ben öyle düşünmüyorum zz'den sonra ne gelir? aaa değil mi? Bu makinede excel yüklü değil (iki kez kontrol etmek için) ama bana doğru geliyor.
Ronnie Royston

6

Olası bir yol aşağıda tanımlandığı gibi olabilir

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

Bunu deneyebilirsin

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

Önce Ascii sayısına çevirin .. Artırın .. sonra Ascii'den char'a çevirin ..

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

FIDDLE'ı kontrol edin


1
Hmm. Daha fazla jQuery gerekiyor.
Jasper

4

Harf dizilerini birden çok kez kullanmam gerekti ve bu işlevi bu SO sorusuna göre yaptım. Umarım bu başkalarına yardımcı olabilir.

function charLoop(from, to, callback)
{
    var i = from.charCodeAt(0);
    var to = to.charCodeAt(0);
    for(;i<=to;i++) callback(String.fromCharCode(i));
}
  • dan - başlangıç harfi
  • - son harf
  • callback (letter) - dizideki her harf için yürütülecek işlev

Bu nasıl kullanılır:

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

Bu çalışan demoya bakın


3

Tüm bu cevapların üzerine ek olarak:

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

Örnek: http://jsfiddle.net/pitaj/3F5Qt/


2

Bu iyi çalışıyor:

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

Sadece gülmek için bir çözüm

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

Bu gerçekten eski. Ancak bu işlevselliğe ihtiyacım vardı ve çözümlerin hiçbiri kullanım durumum için ideal değil. A, b, c ... z, aa, ab ... zz, aaa ... oluşturmak istedim. Bu basit özyineleme işi yapar.

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

Bir kapanışta {a: 'b', b: 'c', vb} ile bir işlev yapın: -

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

kullanım: -

nextChar('a')

Büyük harf ve rakam ekleme: -

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'in bazı sürümlerinde, [...chars]bunun yerine kullanabilirsiniz .chars.split('')



0

Https://stackoverflow.com/a/28490254/881441 adresinde sunduğum rot13 algoritmasının bir varyasyonu :

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

Alttaki giriş kodu ve aranan kodek üsttedir (yani çıkış kodu giriş koduyla aynıdır, ancak 1 kaydırılmıştır). İşlev yalnızca harfleri değiştirir, yani başka bir karakter aktarılırsa, bu kodek tarafından değiştirilmez.


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
Burada tam olarak ne yaptığınızı ve sadece bir kod bloğuna sahip olmak yerine bunun nasıl yardımcı olduğunu açıklamak isteyebilirsiniz, teşekkürler! - Belki koddaki bazı yardımcı komutlar?
Mark Davies

String.fromCharCode () mektubun karakter kodunu döndürür.
LokeshKumar

0

@Nathan wall cevap artışına ve azalmasına göre

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

Kullanım

const ids = new StringIdGenerator();

ids.next(); 
ids.prev();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.