What is a method that can be used to increment letters?

前端 未结 14 2556
我在风中等你
我在风中等你 2020-11-27 04:19

Does anyone know of a Javascript library (e.g. underscore, jQuery, MooTools, etc.) that offers a method of incrementing a letter?

I would like to be able to do somet

相关标签:
14条回答
  • 2020-11-27 04:34

    Based on @Nathan wall answer increment and decrement

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

    Usage

    const ids = new StringIdGenerator();
    
    ids.next(); 
    ids.prev();
    
    0 讨论(0)
  • 2020-11-27 04:35
    
    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;
    
    
    0 讨论(0)
  • 2020-11-27 04:37

    Make a function with {a: 'b', b: 'c', etc} in a closure:-

    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
    

    usage:-

    nextChar('a')
    

    Adding uppercase and digits:-

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

    p.s. In some versions of Javascript, you can use [...chars] instead of chars.split('')

    0 讨论(0)
  • 2020-11-27 04:44

    Adding upon all these answers:

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

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

    0 讨论(0)
  • 2020-11-27 04:44

    A just for laughs solution

    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 讨论(0)
  • 2020-11-27 04:46

    Simple, direct solution

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

    As others have noted, the drawback is it may not handle cases like the letter 'z' as expected. But it depends on what you want out of it. The solution above will return '{' for the character after 'z', and this is the character after 'z' in ASCII, so it could be the result you're looking for depending on what your use case is.


    Unique string generator

    (Updated 2019/05/09)

    Since this answer has received so much visibility I've decided to expand it a bit beyond the scope of the original question to potentially help people who are stumbling on this from Google.

    I find that what I often want is something that will generate sequential, unique strings in a certain character set (such as only using letters), so I've updated this answer to include a class that will do that here:

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

    Usage:

    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'
    
    0 讨论(0)
提交回复
热议问题