从指定范围创建字符数组
Create an array of characters from specified range
我读了一些代码,有人用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
中是否有一些东西可以让这同样容易地完成? 如果没有,是否有允许类似内容的 Node 模块?
如果您使用的是 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 polyfill (core-js/fn/array/from(。
如果你的目标是ES5,我会推荐@wires的Array.apply解决方案,它与这个解决方案非常相似。
最后,Underscore/Lodash 和 Ramda 有一个 range(( 函数:
_.range('A'.charCodeAt(0), 'Z'.charCodeAt(0) + 1).map(i => String.fromCharCode(i));
Javascript本身没有该功能。下面你找到一些如何解决它的例子:
正常功能,基平面中的任何字符(不检查代理项对(
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')
来表示 A-Z 和 a-z:
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 范围中的任何字符。通过使用缓存数组,它比每次都构建数组的函数更快。
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); };
}
您可能还希望创建一个"完整"数组帮助程序。
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"
我认为这可以用功能方式表达得最清楚:将[0 .. 25]
映射到['a' .. 'z']
。
我们可以使用 fromCharCode(n)
将数字转换为字符串。要找到对应于字符的数值,我们需要它的反函数,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]
。然后将每个值的索引i
map
97 + i
== 'a'.charCodeAt(0) + i
(大写从 'A' => 65
开始(。
这第一行可能需要一些解释。我们实际上正在做的事情与 Array(1,2,3)
== [1,2,3]
.我们不是将实际的数组传递给apply
,而是传递一些像数组一样嘎嘎作响的东西(具有 length
属性(。这会导致调用Array(undefined, .. , undefined)
。
看 apply
和"通用数组类对象"了解更多信息。
看看 kannebec 对类似问题的回答。
JavaScript 是否有像"range(("这样的方法来根据提供的边界生成数组?
如果您不想添加自己的函数,而是在一行中:
var abc =
(function(){var output = []; for(var i='A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++)
output.push(String.fromCharCode(i)); return output;})().join(',');
CoffeeScript 编译为 javascript,它有数字范围:
(String.fromCharCode(x+64) for x in [1..26]).join(",")
下面是 coffeescript.org 网站中此脚本的链接。您可以看到它编译成什么javascript,并在浏览器中实时运行它。
(是的,你可以将 coffeescript 用于 Node.js(
方法略有不同
String.fromCharCode(..." ".repeat(26).split("").map((e,i)=>i+'A'.charCodeAt()))
指纹
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
https://stackoverflow.com/a/64599169/8784402
使用单行生成字符列表
const charList = (a,z,d=1)=>(a=a.charCodeAt(),z=z.charCodeAt(),[...Array(Math.floor((z-a)/d)+1)].map((_,i)=>String.fromCharCode(a+i*d)));
console.log("from A to G", charList('A', 'G'));
console.log("from A to Z with step/delta of 2", charList('A', 'Z', 2));
console.log("reverse order from Z to P", charList('Z', 'P', -1));
console.log("from 0 to 5", charList('0', '5', 1));
console.log("from 9 to 5", charList('9', '5', -1));
console.log("from 0 to 8 with step 2", charList('0', '8', 2));
console.log("from α to ω", charList('α', 'ω'));
console.log("Hindi characters from क to ह", charList('क', 'ह'));
console.log("Russian characters from А to Я", charList('А', 'Я'));
对于打字稿 const charList = (p: string, q: string, d = 1) => {
const a = p.charCodeAt(0),
z = q.charCodeAt(0);
return [...Array(Math.floor((z - a) / d) + 1)].map((_, i) =>
String.fromCharCode(a + i * d)
);
};
也许这个函数会对你有所帮助。
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 对象。您需要编写一个函数来创建抽象 Range,然后为等效性添加一个 to_a
方法。
为了好玩,这里有一种获得确切输出的替代方法,没有中间字符串。
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(',');
给出范围 A-Z,但我也喜欢某些功能选项。
> let charRange = (start, end) => Array.from(new Array(end.charCodeAt(0) - start.charCodeAt(0) + 1)).map((e,i) => String.fromCharCode(start.charCodeAt(0) + i));
[Function: charRange]
> charRange('B','X');
[
'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X'
]
- 从指定范围创建字符数组
- 第一个字第一个字符第二个字第二个字符,一直到数组结束
- 正在转义javascript数组中的html字符
- 为什么Angularjs服务返回的是字符数组而不是对象数组
- 将组成单词的字符添加到数组的开头
- 用javascript将字符串连接到数组中
- 用Objective-C将JSON解析成C风格的字符数组
- 打破ng中的字符数组,重复并设置每个字符自己的输入标记
- 计算JavaScript中句子(数组)中字符(数组)的出现次数
- 将句子字符串拆分为单词数组,然后将单词数组拆分为单词数组中的字符数组
- 使用JavaScript将字符串转换为字符数组
- 从占转义字符的字符数组创建字符串
- 如何从字符数组中创建3个唯一值
- 在Chrome下,Base-64字符数组异常的无效长度
- 将正则表达式与字符数组匹配
- 通过字符数组转义字符串
- 替换字符串中的字符数组
- 如何将Javascript字符串转换为八位字节/字符数组
- 在字符数组中循环
- 使用敲除扩展程序不允许使用字符数组