在PHP中,您可以。。。

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

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

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


当前回答

这里有一个npm模块bereich(“bereich”是德语中“范围”的意思)。它利用了现代JavaScript的迭代器,因此您可以以各种方式使用它,例如:

console.log(...bereich(1, 10));
// => 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

const numbers = Array.from(bereich(1, 10));
// => [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

for (const number of bereich(1, 10)) {
  // ...
}

它还支持递减范围(通过简单地交换最小值和最大值),并且还支持除1以外的步骤。

免责声明:我是本模块的作者,所以请对我的答案持保留态度。

其他回答

一个有趣的挑战是编写最短的函数来实现这一点。救援递归!

function r(a,b){return a>b?[]:[a].concat(r(++a,b))}

在大范围内往往速度较慢,但幸运的是量子计算机即将问世。

另一个额外的好处是,它令人困惑。因为我们都知道隐藏代码以防被窥探是多么重要。

要真正彻底混淆功能,请执行以下操作:

function r(a,b){return (a<b?[a,b].concat(r(++a,--b)):a>b?[]:[a]).sort(function(a,b){return a-b})}

使用Harmony排列运算符和箭头函数:

var range = (start, end) => [...Array(end - start + 1)].map((_, i) => start + i);

例子:

range(10, 15);
[ 10, 11, 12, 13, 14, 15 ]

函数范围(firstNum,lastNum){let rangeList=[];如果(firstNum>lastNum){return console.error(“第一个数字不能大于最后一个数字”);}让counter=firstNum;while(计数器<=lastNum){rangeList.push(计数器);计数器++;}返回范围列表;}

对一些不同的范围函数进行了研究。检查执行这些函数的不同方法的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倍。

对于具有良好向后兼容性的更像红宝石的方法:

范围([开始],结束=0),其中开始和结束是数字

var range = function(begin, end) {
  if (typeof end === "undefined") {
    end = begin; begin = 0;
  }
  var result = [], modifier = end > begin ? 1 : -1;
  for ( var i = 0; i <= Math.abs(end - begin); i++ ) {
    result.push(begin + i * modifier);
  }
  return result;
}

示例:

range(3); //=> [0, 1, 2, 3]
range(-2); //=> [0, -1, -2]
range(1, 2) //=> [1, 2]
range(1, -2); //=> [1, 0, -1, -2]