在PHP中,您可以。。。
range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")
也就是说,有一个函数可以通过传递上下限来获得一系列数字或字符。
JavaScript本机是否有内置的功能?如果没有,我将如何实施?
在PHP中,您可以。。。
range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")
也就是说,有一个函数可以通过传递上下限来获得一系列数字或字符。
JavaScript本机是否有内置的功能?如果没有,我将如何实施?
当前回答
好的,在JavaScript中,我们没有像PHP那样的range()函数,所以我们需要创建一个非常简单的函数
对于数字:
function numberRange (start, end) {
return new Array(end - start).fill().map((d, i) => i + start);
}
并将其称为:
numberRange(5, 10); //[5, 6, 7, 8, 9]
对于字母:
function alphabetRange (start, end) {
return new Array(end.charCodeAt(0) - start.charCodeAt(0)).fill().map((d, i) => String.fromCharCode(i + start.charCodeAt(0)));
}
并将其称为:
alphabetRange('c', 'h'); //["c", "d", "e", "f", "g"]
其他回答
数字
[...Array(5).keys()];
=> [0, 1, 2, 3, 4]
字符迭代
String.fromCharCode(...[...Array('D'.charCodeAt(0) - 'A'.charCodeAt(0) + 1).keys()].map(i => i + 'A'.charCodeAt(0)));
=> "ABCD"
迭代
for (const x of Array(5).keys()) {
console.log(x, String.fromCharCode('A'.charCodeAt(0) + x));
}
=> 0,"A" 1,"B" 2,"C" 3,"D" 4,"E"
作为函数
function range(size, startAt = 0) {
return [...Array(size).keys()].map(i => i + startAt);
}
function characterRange(startChar, endChar) {
return String.fromCharCode(...range(endChar.charCodeAt(0) -
startChar.charCodeAt(0), startChar.charCodeAt(0)))
}
类型化函数
function range(size:number, startAt:number = 0):ReadonlyArray<number> {
return [...Array(size).keys()].map(i => i + startAt);
}
function characterRange(startChar:string, endChar:string):ReadonlyArray<string> {
return String.fromCharCode(...range(endChar.charCodeAt(0) -
startChar.charCodeAt(0), startChar.charCodeAt(0)))
}
lodash.js_.range()函数
_.range(10);
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11);
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5);
=> [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1);
=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
String.fromCharCode(..._.range('A'.charCodeAt(0), 'D'.charCodeAt(0) + 1));
=> "ABCD"
没有库的旧非es6浏览器:
Array.apply(null, Array(5)).map(function (_, i) {return i;});
=> [0, 1, 2, 3, 4]
console.log([…Array(5).keys()]);
(ES6归功于尼尔斯·彼得索恩和其他评论者)
// range() 0..10, step=1
// range(max) 0..max, step=1
// range(min,max) min..max, step=1
// range(min,step,max) min..max, step=step
// Use:
// console.log(...range(3));
// Array.from(range(5))
// [...range(100)]
// for (const v of range(1,10)) { ...
function* range(...args) {
let [min, step, max] = {
0: [0, 1, 10],
1: [0, args[0] >= 0 ? 1 : -1, args[0]],
2: [args[0], args[1] >= args[0] ? 1 : -1, args[1]],
3: args,
}[args.length] || [];
if (min === undefined) throw new SyntaxError("Too many arguments");
let x = min;
while (step >= 0 ? x < max : x > max) {
yield x;
x += step
}
}
console.log(...range()); // 0 1 2 3 4 5 6 7 8 9
console.log(...range(3)); // 0 1 2
console.log(...range(2, 5)); // 2 3 4
console.log(...range(5, 2)); // 5 4 3
console.log(...range(3, -3)); // 3 2 1 0 -1 -2
console.log(...range(-3, 3)); // -3 -2 -1 0 1 2
console.log(...range(-5, -2));// -5 -4 -3
console.log(...range(-2, -5));// -2 -3 -4
下面是实现自己的可迭代范围函数的方法。
//实施范围功能范围(开始、结束){返回{从:开始,结束,[Symbol.iiterator](){this.current=this.from;返回此;},next(){if(this.current<=this.to){返回{done:false,值:this.current++};}其他{返回{done:true};}}};}//迭代每个值for(设范围数(1,5)){console.log(num);//1, 2, 3, 4, 5}
这是我模仿Python的解决方案。在底部,您可以找到一些如何使用它的示例。它与数字一起工作,就像Python的范围一样:
var assert = require('assert'); // if you use Node, otherwise remove the asserts
var L = {}; // L, i.e. 'list'
// range(start, end, step)
L.range = function (a, b, c) {
assert(arguments.length >= 1 && arguments.length <= 3);
if (arguments.length === 3) {
assert(c != 0);
}
var li = [],
i,
start, end, step,
up = true; // Increasing or decreasing order? Default: increasing.
if (arguments.length === 1) {
start = 0;
end = a;
step = 1;
}
if (arguments.length === 2) {
start = a;
end = b;
step = 1;
}
if (arguments.length === 3) {
start = a;
end = b;
step = c;
if (c < 0) {
up = false;
}
}
if (up) {
for (i = start; i < end; i += step) {
li.push(i);
}
} else {
for (i = start; i > end; i += step) {
li.push(i);
}
}
return li;
}
示例:
// range
L.range(0) -> []
L.range(1) -> [0]
L.range(2) -> [0, 1]
L.range(5) -> [0, 1, 2, 3, 4]
L.range(1, 5) -> [1, 2, 3, 4]
L.range(6, 4) -> []
L.range(-2, 2) -> [-2, -1, 0, 1]
L.range(1, 5, 1) -> [1, 2, 3, 4]
L.range(0, 10, 2) -> [0, 2, 4, 6, 8]
L.range(10, 2, -1) -> [10, 9, 8, 7, 6, 5, 4, 3]
L.range(10, 2, -2) -> [10, 8, 6, 4]
范围(开始、结束、步骤):使用ES6迭代器
你只要求上限和下限。在这里,我们也创建了一个带步骤的。
您可以轻松创建range()生成器函数,该函数可以用作迭代器。这意味着您不必预先生成整个阵列。
function * range ( start, end, step = 1 ) {
let state = start;
while ( state < end ) {
yield state;
state += step;
}
return;
};
现在,您可能需要创建一个从迭代器预生成数组并返回列表的东西。这对于接受数组的函数很有用。为此,我们可以使用Array.from()
const generate_array = (start,end,step) =>
Array.from( range(start,end,step) );
现在您可以轻松生成静态数组,
const array1 = generate_array(1,10,2);
const array1 = generate_array(1,7);
但是,当需要迭代器(或允许您使用迭代器)时,您也可以轻松创建迭代器。
for ( const i of range(1, Number.MAX_SAFE_INTEGER, 7) ) {
console.log(i)
}
特别注意事项
如果你使用Ramda,他们和Lodash一样有自己的R.range