首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何仅在ES2015中生成从0到n的数字范围?

如何仅在ES2015中生成从0到n的数字范围?
EN

Stack Overflow用户
提问于 2016-04-29 21:39:18
回答 16查看 181.2K关注 0票数 181

我总是发现range函数在JavaScript中缺失了,因为它可以在python和其他地方使用?是否有任何简洁的方法来生成ES2015中的数字范围?

编辑:我的问题不同于上述的复制,因为它是特定于ES2015,而不是ECMASCRIPT-5。另外,我需要从0开始的范围,而不是特定的起始数(虽然如果有这个值的话会很好)。

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2016-04-30 09:43:27

您可以在新创建的数组的键上使用扩展运算符。

[...Array(n).keys()]

Array.from(Array(n).keys())

如果使用Array.from(),则必须使用TypeScript语法。

票数 330
EN

Stack Overflow用户

发布于 2016-05-01 06:54:33

我还发现了一种更直观的使用Array.from的方法

代码语言:javascript
运行
复制
const range = n => Array.from({length: n}, (value, key) => key)

现在,这个range函数将返回从0开始到n-1的所有数字。

支持startend的范围的一个修改版本是:

代码语言:javascript
运行
复制
const range = (start, end) => Array.from({length: (end - start)}, (v, k) => k + start);

如@marco6 6所建议的那样,编辑,如果它适合您的用例,可以将其作为静态方法使用。

代码语言:javascript
运行
复制
Array.range = (start, end) => Array.from({length: (end - start)}, (v, k) => k + start);

并把它当作

代码语言:javascript
运行
复制
Array.range(3, 9)
票数 112
EN

Stack Overflow用户

发布于 2018-03-30 15:46:49

与德尔塔/步骤

最小和单线

代码语言:javascript
运行
复制
[...Array(N)].map((_, i) => from + i * step);

实例和其他替代办法

代码语言:javascript
运行
复制
[...Array(10)].map((_, i) => 4 + i * 2);
//=> [4, 6, 8, 10, 12, 14, 16, 18, 20, 22]

Array.from(Array(10)).map((_, i) => 4 + i * 2);
//=> [4, 6, 8, 10, 12, 14, 16, 18, 20, 22]

Array.from(Array(10).keys()).map(i => 4 + i * 2);
//=> [4, 6, 8, 10, 12, 14, 16, 18, 20, 22]

[...Array(10).keys()].map(i => 4 + i * -2);
//=> [4, 2, 0, -2, -4, -6, -8, -10, -12, -14]

Array(10).fill(0).map((_, i) => 4 + i * 2);
//=> [4, 6, 8, 10, 12, 14, 16, 18, 20, 22]

Array(10).fill().map((_, i) => 4 + i * -2);
//=> [4, 2, 0, -2, -4, -6, -8, -10, -12, -14]

距离函数

代码语言:javascript
运行
复制
const range = (from, to, step) =>
  [...Array(Math.floor((to - from) / step) + 1)].map((_, i) => from + i * step);

range(0, 9, 2);
//=> [0, 2, 4, 6, 8]

// can also assign range function as static method in Array class (but not recommended )
Array.range = (from, to, step) =>
  [...Array(Math.floor((to - from) / step) + 1)].map((_, i) => from + i * step);

Array.range(2, 10, 2);
//=> [2, 4, 6, 8, 10]

Array.range(0, 10, 1);
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Array.range(2, 10, -1);
//=> []

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

作为迭代器

代码语言:javascript
运行
复制
class Range {
  constructor(total = 0, step = 1, from = 0) {
    this[Symbol.iterator] = function* () {
      for (let i = 0; i < total; yield from + i++ * step) {}
    };
  }
}

[...new Range(5)]; // Five Elements
//=> [0, 1, 2, 3, 4]
[...new Range(5, 2)]; // Five Elements With Step 2
//=> [0, 2, 4, 6, 8]
[...new Range(5, -2, 10)]; // Five Elements With Step -2 From 10
//=>[10, 8, 6, 4, 2]
[...new Range(5, -2, -10)]; // Five Elements With Step -2 From -10
//=> [-10, -12, -14, -16, -18]

// Also works with for..of loop
for (i of new Range(5, -2, 10)) console.log(i);
// 10 8 6 4 2

仅作为发电机

代码语言:javascript
运行
复制
const Range = function* (total = 0, step = 1, from = 0) {
  for (let i = 0; i < total; yield from + i++ * step) {}
};

Array.from(Range(5, -2, -10));
//=> [-10, -12, -14, -16, -18]

[...Range(5, -2, -10)]; // Five Elements With Step -2 From -10
//=> [-10, -12, -14, -16, -18]

// Also works with for..of loop
for (i of Range(5, -2, 10)) console.log(i);
// 10 8 6 4 2

// Lazy loaded way
const number0toInf = Range(Infinity);
number0toInf.next().value;
//=> 0
number0toInf.next().value;
//=> 1
// ...

从-到带台阶/增量

使用迭代器

代码语言:javascript
运行
复制
class Range2 {
  constructor(to = 0, step = 1, from = 0) {
    this[Symbol.iterator] = function* () {
      let i = 0,
        length = Math.floor((to - from) / step) + 1;
      while (i < length) yield from + i++ * step;
    };
  }
}
[...new Range2(5)]; // First 5 Whole Numbers
//=> [0, 1, 2, 3, 4, 5]

[...new Range2(5, 2)]; // From 0 to 5 with step 2
//=> [0, 2, 4]

[...new Range2(5, -2, 10)]; // From 10 to 5 with step -2
//=> [10, 8, 6]

使用发电机

代码语言:javascript
运行
复制
const Range2 = function* (to = 0, step = 1, from = 0) {
  let i = 0,
    length = Math.floor((to - from) / step) + 1;
  while (i < length) yield from + i++ * step;
};

[...Range2(5, -2, 10)]; // From 10 to 5 with step -2
//=> [10, 8, 6]

let even4to10 = Range2(10, 2, 4);
even4to10.next().value;
//=> 4
even4to10.next().value;
//=> 6
even4to10.next().value;
//=> 8
even4to10.next().value;
//=> 10
even4to10.next().value;
//=> undefined
票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36947847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档