Skip to content Skip to sidebar Skip to footer

Create An Array Of Characters From Specified Range

I read some code where someone did this in Ruby: puts ('A'..'Z').to_a.join(',') output: 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 Is there something in Javascript that

Solution 1:

If you're using ES6, you can generate a sequence using Array.from() by passing in an array-like object for the length of the range, and a map function as a second argument to convert the array key of each item in the range into a character using String.fromCharCode():

Array.from({ length: 26 }, (_, i) =>String.fromCharCode('A'.charCodeAt(0) + i));

You can also use the Array constructor (note: ES6 allows constructors to be invoked either with a function call or with the new operator) to initialize an array of the desired default length, fill it using Array.fill(), then map through it:

Array(26).fill().map((_, i) =>String.fromCharCode('A'.charCodeAt(0) + i));

The same can be accomplished with the spread operator:

[...Array(26)].map((_, i) =>String.fromCharCode('A'.charCodeAt(0) + i));

The above three examples will return an array with characters from A to Z. For custom ranges, you can adjust the length and starting character.

For browsers that don't support ES6, you can use babel-polyfill or core-js polyfill (core-js/fn/array/from).

If you're targeting ES5, I would recommend the Array.apply solution by @wires which is very similar to this one.

Lastly, Underscore/Lodash and Ramda have a range() function:

_.range('A'.charCodeAt(0), 'Z'.charCodeAt(0) + 1).map(i => String.fromCharCode(i));

Solution 2:

Javascript doesn't have that functionality natively. Below you find some examples of how it could be solved:

Normal function, any characters from the base plane (no checking for surrogate pairs)

functionrange(start,stop) {
  var result=[];
  for (var idx=start.charCodeAt(0),end=stop.charCodeAt(0); idx <=end; ++idx){
    result.push(String.fromCharCode(idx));
  }
  return result;
};

range('A','Z').join();

The same as above, but as a function added to the array prototype, and therefore available to all arrays:

Array.prototype.add_range = function(start,stop) {
  for (var idx=start.charCodeAt(0),end=stop.charCodeAt(0); idx <=end; ++idx){
    this.push(String.fromCharCode(idx));
  }
  returnthis;
};

[].add_range('A','Z').join();

A range from preselected characters. Is faster than the functions above, and let you use alphanum_range('A','z') to mean A-Z and a-z:

var alphanum_range = (function() {
  vardata = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.split('');
  return function (start,stop) {
    start = data.indexOf(start);
    stop = data.indexOf(stop);
    return (!~start || !~stop) ? null : data.slice(start,stop+1);
  };
})();

alphanum_range('A','Z').join();

Or any character from the ascii range. By using a cached array, it is faster than the functions that build the array every time.

var ascii_range = (function() {
  vardata = [];
  while (data.length < 128) data.push(String.fromCharCode(data.length));
  return function (start,stop) {
    start = start.charCodeAt(0);
    stop = stop.charCodeAt(0);
    return (start < 0 || start > 127 || stop < 0 || stop > 127) ? null : data.slice(start,stop+1);
  };
})();

ascii_range('A','Z').join();

Solution 3:

var chars = [].concat.apply([], Array(26))
              .map(function(_, i) { returnString.fromCharCode(i+65); })
              .join();

The .map function could be a function generator that could be used for different character sets.

functioncharRange(start) {
    var base = start.charCodeAt(0);
    returnfunction(_, i) { returnString.fromCharCode(i + base); };
}

And you may also want to create a "full" Array helper.

functionfullArray(len) { return [].concat.apply([], Array(len)); }

Then use them like this.

var chars = fullArray(26).map(charRange("A"))
                         .join();

Solution 4:

TL;DR

// ['a', .. , 'z']Array.apply(null, {length: 26})
    .map(function (x,i) { returnString.fromCharCode(97 + i) });

Or even

functionrange(first, last) {
    var a = first.charCodeAt(0)
    var b = last.charCodeAt(0) + 1returnArray.apply(null, {length: Math.abs(b - a)})
      .map(function (x,i) { returnString.fromCharCode(Math.min(a, b) + i) });
}
range('K','M') // => ['K','L','M']range('$','z') // => "$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz"

I think this can be expressed clearest in a functional way: map [0 .. 25] to ['a' .. 'z'].

We can use fromCharCode(n) to convert a number into a string. To find the numerical value corresponding to a character we need it's inverse function, toCharCode(s):

var toCharCode = function(s){ return s.charCodeAt(0) } // 'a' => 97, 'b' => 98, ..

Then the rest is easy:

Array.apply(null, {length: 26})
     .map(function (x,i) { returnString.fromCharCode(97 + i) });

Constructs an array of 26 undefined's: [undefined, ... , undefined]. Then map index i of each value to 97 + i == 'a'.charCodeAt(0) + i (for uppercase start at 'A' => 65).

This first line might need some explanation. What we are effectively doing is the same as Array(1,2,3) == [1,2,3]. Instead of passing an actual array to apply, we pass something that quacks like an array (has the length property). This results in calling Array(undefined, .. , undefined).

See apply and "generic array-like object" for more infomation.

Solution 5:

Take a look at the answer from kannebec for a similar question.

Does JavaScript have a method like "range()" to generate an array based on supplied bounds?

If you don't want to add an own function, but in one line:

var abc = 
(function(){var output = []; for(var i='A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++)
    output.push(String.fromCharCode(i)); return output;})().join(',');

Post a Comment for "Create An Array Of Characters From Specified Range"