在PHP中,您可以。。。

range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")

也就是说,有一个函数可以通过传递上下限来获得一系列数字或字符。

JavaScript本机是否有内置的功能?如果没有,我将如何实施?


当前回答

我找到的最接近的是radash图书馆:

import { range } from 'radash'

for (let i of range(1, 5)) {
    console.log(i)
}

请参阅此处的文档:

范围Radash

其他回答

对一些不同的范围函数进行了研究。检查执行这些函数的不同方法的jsperf比较。当然不是一个完美或详尽的列表,但应该有帮助:)

获胜者是。。。

function range(lowEnd,highEnd){
    var arr = [],
    c = highEnd - lowEnd + 1;
    while ( c-- ) {
        arr[c] = highEnd--
    }
    return arr;
}
range(0,31);

从技术上讲,它不是firefox上最快的,但铬合金上的疯狂速度差(imho)弥补了这一点。

还有一个有趣的观察是,与firefox相比,chrome使用这些阵列功能的速度要快得多。Chrome速度至少快4或5倍。

var range = (l,r) => new Array(r - l).fill().map((_,k) => k + l);

方便的函数来完成这个技巧,请运行下面的代码片段

功能范围(开始、结束、步长、偏移){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*索引将为我们提供所需的值

我的代码高尔夫同事想出了这个(ES6),包容的:

(s,f)=>[...Array(f-s+1)].map((e,i)=>i+s)

非包容性:

(s,f)=>[...Array(f-s)].map((e,i)=>i+s)

我很惊讶地看到了这条线索,并没有看到任何类似我的解决方案(也许我错过了答案),所以就在这里。我在ES6语法中使用了一个简单的范围函数:

// [begin, end[
const range = (b, e) => Array.apply(null, Array(e - b)).map((_, i) => {return i+b;});

但它只在向前计数时有效(即begin<end),因此我们可以在需要时对其进行轻微修改,如下所示:

const range = (b, e) => Array.apply(null, Array(Math.abs(e - b))).map((_, i) => {return b < e ? i+b : b-i;});