在PHP中,您可以。。。

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

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

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


当前回答

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

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 ]

已经给出了非常好的答案,但我没有看到ES6迭代器的完整使用来实现范围的完整实现,所以这里是:

/**
 * inspired by Python's built-in range utility function
 * implemented using ES6 Iterable, Iterator  protolols (interfaces)
 */
class Range {
  constructor(...args) {
    this.start = args.length <= 1 ? 0 : args[0];
    this.end = args.length <= 1 ? args[0] || 0 : args[1];
    this.step = args.length <= 2 ? 1 : args[2];
  }

  [Symbol.iterator]() {
    return this;
  }

  next() {
    if (this.end > this.start) {
      const result = { done: false, value: this.start };
      this.start = this.start + this.step;
      return result;
    } else return { done: true, value: undefined };
  }
}

/**
 * Symbol.iterator is part of the couple of inbuilt symbols
 * available in JavaScript. It allows for hooking into the
 * inbuilt for of iteration mechanism. This is why the
 * Symbol.iterator comes into play when talking about
 * iterables and iterators in JavaScript.
 */

function range(...args) {
  return new Range(...args);
}

console.log([...range(4)]);        // [0, 1, 2, 3]
console.log([...range(2, 5)]);     // [2, 3, 4]
console.log([...range(1, 10, 3)]); // [1, 4, 7]

一个定义了硬整数的范围有很多答案,但是如果你不知道这一步,而你想在这一步之间多走几步呢?

我写这段代码就是为了做到这一点。这很不言自明。

const stepScale = (min, max, numberOfSteps) => {
  const _numberOfSteps = numberOfSteps - 1
  const scaleBy = (max - min) / _numberOfSteps

  const arr = []
  for (let i = 0; i <= _numberOfSteps; i += 1) {
    arr.push(min + scaleBy * i)
  }
  return arr
}

export default stepScale
stepScale(5, 10, 4)
// [5, 6.666666666666667, 8.333333333333334, 10]

对于npmhttps://npm.im/@通用标准/步长

d3还具有内置范围功能。

看见https://github.com/d3/d3-array#range:

d3.范围([开始,]停止[,步骤])

生成包含算术级数的数组,类似于Python内置范围。此方法通常用于迭代一系列数值或整数值,例如数组中的索引。与Python版本不同,参数不需要是整数,但如果是由于浮点精度,则结果更可预测。如果省略步骤,则默认为1。

例子:

d3.range(10)
// returns [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

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

import { range } from 'radash'

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

请参阅此处的文档:

范围Radash