在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本机是否有内置的功能?如果没有,我将如何实施?
当前回答
这是我模仿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]
其他回答
这是我模仿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]
我在for循环中使用条件三元运算符(不过没有参数测试)。
function range(start,end,step){
var resar = [];
for (var i=start;(step<0 ? i>=end:i<=end); i += (step == undefined ? 1:step)){
resar.push(i);
};
return resar;
};
您还可以执行以下操作:
const range = Array.from(Array(size)).map((el, idx) => idx+1).slice(begin, end);
这个也反过来。
const range = ( a , b ) => Array.from( new Array( b > a ? b - a : a - b ), ( x, i ) => b > a ? i + a : a - i );
range( -3, 2 ); // [ -3, -2, -1, 0, 1 ]
range( 1, -4 ); // [ 1, 0, -1, -2, -3 ]
方便的函数来完成这个技巧,请运行下面的代码片段
功能范围(开始、结束、步长、偏移){var len=(数学.abs(结束-开始)+((偏移量||0)*2))/(步骤||1)+1;var方向=开始<结束?1 : -1;var startingPoint=开始-(方向*(偏移||0));var stepSize=方向*(步骤||1);return Array(len).fill(0).map(函数(_,索引){return startingPoint+(stepSize*索引);});}console.log('范围(1,5)=>'+范围(1、5));console.log('范围(5,1)=>'+范围(5、1));console.log('范围(5,5)=>'+范围(5、5));console.log('范围(-5,5)=>'+范围(-5、5));console.log('范围(-10,5,5)=>'+范围(-10、5,5));console.log('范围(1,5,1,2)=>'+范围(1、5、1,2;
下面是如何使用它
范围(开始,结束,步长=1,偏移=0);
包括-前进档(5,10)//[5,6,7,8,9,10]包括-向后范围(10,5)//[10,9,8,7,6,5]后退范围(10,2,2)//[10,8,6,4,2]排他-前进范围(5,10,0,-1)//[6,7,8,9]而不是5,10本身偏移-扩展范围(5,10,0,1)//[4,5,6,7,8,9,10,11]偏移-收缩范围(5,10,0,-2)//[7,8]步进-扩展范围(10,0,2,2)//[12,10,8,6,4,2,0,-2]
希望你觉得它有用。
这就是它的工作原理。
基本上,我首先计算得到的数组的长度,并创建一个长度为零的填充数组,然后用所需的值填充
(step | |1)=>其他类似的方法使用step的值,如果没有提供,则使用1我们首先使用(Math.abs(end-start)+((offset | |0)*2))/(step | |1)+1)计算结果数组的长度,以使其更简单(两个方向上的差值*offset/step)获得长度后,我们使用newArray(length).fill(0)创建一个带有初始化值的空数组;在此处检查现在我们有一个数组[0,0,0,..],其长度是我们想要的。我们对其进行映射,并使用array.map(function(){})返回一个具有所需值的新数组var方向=开始<结束?1 : 0; 显然,如果起点不小于终点,我们就需要后退。我的意思是从0到5,反之亦然在每次迭代中,startingPoint+stepSize*索引将为我们提供所需的值