从指定范围创build一个字符数组

我读了一些代码,其中有人在Ruby中这样做:

puts ('A'..'Z').to_a.join(',') 

输出:

 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 

Javascript中有什么东西可以让事情变得简单吗? 如果没有,是否有节点模块,允许类似的东西?

Javascript本身没有这个function。 下面你可以find一些如何解决的例子:

正常function,来自基准面的任何字符(不检查代理对)

 function range(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(); 

与上面相同,但作为一个函数添加到数组原型,因此可用于所有数组:

 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)); } return this; }; [].add_range('A','Z').join(); 

范围从预选的字符。 比上面的函数更快,并且让你使用alphanum_range('A','z')来表示AZ和az:

 var alphanum_range = (function() { var data = '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(); 

或从ascii范围内的任何字符。 通过使用caching数组,它比每次构build数组的函数都快。

 var ascii_range = (function() { var data = []; 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(); 
 var chars = [].concat.apply([], Array(26)) .map(function(_, i) { return String.fromCharCode(i+65); }) .join(); 

.map函数可以是一个函数发生器,可以用于不同的字符集。

 function charRange(start) { var base = start.charCodeAt(0); return function(_, i) { return String.fromCharCode(i + base); }; } 

你也可能想创build一个“完整的”数组帮助器。

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

然后像这样使用它们。

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

TL; DR

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

甚至

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

我认为这可以用一种function性的方式expression清楚:map [0 .. 25] to ['a' .. 'z']

我们可以使用fromCharCode(n)将一个数字转换成一个string。 要find对应于某个字符的数值,我们需要它的反函数toCharCode(s)

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

其余的很容易:

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

构造一个26个未定义的数组: [undefined, ... , undefined] 。 然后map每个值的索引i map97 + i == 'a'.charCodeAt(0) + i (大写字母在'A' => 65 )。

这第一行可能需要一些解释。 我们正在做的和Array(1,2,3) == [1,2,3] 。 而不是传递一个实际的数组来apply ,我们传递一个像数组一样的东西(具有length属性)。 这导致调用Array(undefined, .. , undefined)

有关更多信息,请参阅apply和“通用数组对象” 。

看一下kannebec的回答是否有类似的问题。

JavaScript是否有像“range()”这样的方法来根据提供的边界生成一个数组?

如果您不想添加自己的function,但在一行中:

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

如果你使用的是ES6,你可以使用Array.from()生成一个序列,方法是传入一个类似数组的对象作为范围的长度,然后使用一个map函数作为第二个参数来转换每个项的数组键使用String.fromCharCode()将字符转换为字符:

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

您也可以使用Array构造函数(注意:ES6允许构造函数通过函数调用或new运算符来调用)来初始化一个所需默认长度的数组,然后使用Array.fill()填充它,然后映射它:

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

使用扩展操作符可以完成相同的操作 :

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

以上三个例子将返回一个字符数组从A到Z的数组。对于自定义范围,您可以调整长度和起始字符。

对于不支持ES6的浏览器,可以使用babel-polyfill或core-js填充(core-js / fn / array / from)。

如果你的目标是ES5,我会推荐@wires的Array.apply解决scheme,它和这个非常相似。

最后,Underscore / Lodash和Ramda有一个range()函数:

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

CoffeeScript编译为JavaScript,并有数字范围:

 (String.fromCharCode(x+64) for x in [1..26]).join(",") 

这是在coffeescript.org网站上的这个脚本的链接 。 你可以看到它编译的JavaScript,并在你的浏览器中运行。

( 是的 ,你可以使用coffeescript Node.js)

也许这个function会帮助你。

 function range ( low, high, step ) { // Create an array containing a range of elements // // + original by: _argos var matrix = []; var inival, endval, plus; var walker = step || 1; var chars = false; if ( !isNaN ( low ) && !isNaN ( high ) ) { inival = low; endval = high; } else if ( isNaN ( low ) && isNaN ( high ) ) { chars = true; inival = low.charCodeAt ( 0 ); endval = high.charCodeAt ( 0 ); } else { inival = ( isNaN ( low ) ? 0 : low ); endval = ( isNaN ( high ) ? 0 : high ); } plus = ( ( inival > endval ) ? false : true ); if ( plus ) { while ( inival <= endval ) { matrix.push ( ( ( chars ) ? String.fromCharCode ( inival ) : inival ) ); inival += walker; } } else { while ( inival >= endval ) { matrix.push ( ( ( chars ) ? String.fromCharCode ( inival ) : inival ) ); inival -= walker; } } return matrix; } console.log(range('A','Z')) // ["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"] 

这不是我的,取自: http : //javascript.ru/php/range

不,JavaScript没有任何内置的Range对象。 你需要编写一个函数来创build一个抽象的Range,然后添加一个to_a方法来实现等价。

为了好玩,这里有一个替代的方法来获得确切的输出,没有中间string。

 function commaRange(startChar,endChar){ var c=','.charCodeAt(0); for (var a=[],i=startChar.charCodeAt(0),e=endChar.charCodeAt(0);i<=e;++i){ a.push(i); a.push(c); } a.pop(); return String.fromCharCode.apply(String,a); } console.log(commaRange('A','J')); // "A,B,C,D,E,F,G,H,I,J" 

对于Node.js,有一个Lazy模块。

 function range(r, x) { var c1 = r.charCodeAt(0)+1, c2 = r.charCodeAt(3), s = r[0]; if(c1 && c2)while (c1 <= c2) s += (x || "") + String.fromCharCode(c1++); return s; } range("A--S", ","); 
 var range = []; for(var i = 65; i < 91; i++) { range.push(String.fromCharCode(i)); } range = range.join(','); 

给出范围az,但我也喜欢一些function选项。

略有不同的做法

 String.fromCharCode(..." ".repeat(26).split("").map((e,i)=>i+'A'.charCodeAt())) 

版画

 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"