首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES6/7等价于下划线的范围函数

ES6/7等价于下划线的范围函数
EN

Stack Overflow用户
提问于 2017-11-08 21:30:05
回答 3查看 2.5K关注 0票数 5

是否有任何ECMAScript 6/7等效于下划线的range函数?

下划线:

代码语言:javascript
复制
_.range(startPage, endPage + 1);

在ES2015中:

代码语言:javascript
复制
Array.from(Array(n), (_, i) => x + i)

不确定ES2015版本是如何工作的。我想知道javascript的ecmascript中的范围是如何工作的

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-08 21:32:51

其思想是创建一个长度为end - start + 1的数组,然后使用Array#from填充相关的数字。

Array.from()方法从类似数组或可迭代的对象创建一个新的数组实例。

在这种情况下,Array#from需要一个具有length属性的对象。使用Array(n)创建这样一个对象(数组)。您也可以直接使用{ length: n }。在这种情况下,n = Math.abs(end - start) + 1

Array#from接受mapFn回调,这是一个可以转换迭代值的函数。函数接收两个参数--值(在本例中我们可以忽略它)和索引(基于0)。将start添加到当前索引将创建范围内的数字。

代码语言:javascript
复制
const range = (start, end) => Array.from(
  Array(Math.abs(end - start) + 1), 
  (_, i) => start + i
);

console.log(range(5, 10));
console.log(range(-10, -5));
console.log(range(-5, 10));

此版本还将处理反向范围(大小不等):

代码语言:javascript
复制
const range = (start, end) => {
  const inc = (end - start) / Math.abs(end - start);
  
  return Array.from(
    Array(Math.abs(end - start) + 1), 
    (_, i) => start + i * inc
  );
};

console.log(range(5, 10));
console.log(range(-5, -10));
console.log(range(10, -5));

票数 12
EN

Stack Overflow用户

发布于 2019-12-22 17:09:34

请注意,以下实现不允许延迟生成列表:

代码语言:javascript
复制
Array.from(Array(n), (_, i) => x + i)

假设您需要一个100万个数字的列表:

代码语言:javascript
复制
range(1, 1000000);

你要把它们全吃光吗?也许没有,但是所有的数字都已经生成了,它们可能在你的记忆中留下了一个重要的足迹。

如果我们能按要求一个接一个地给他们买,那就太好了。

事实证明,我们完全可以用发电机做到这一点:

代码语言:javascript
复制
function* range(start, end, step = 1) {
  for (let value = start; value < end; value += step) {
    yield value;
  }
}

for (let x of range(1, Infinity)) {
  if (x > 10) {
    break;
  }
  console.log(x);
}

你注意到range(1, Infinity)钻头了吗?

在一个所有数字都是预先生成的典型实现中,这段代码甚至不会运行,因为您将陷入无限生成数字的循环中。

票数 2
EN

Stack Overflow用户

发布于 2022-10-19 06:56:02

据我所知,range方法从start开始生成一个数字数组,使用step (默认值= 1)步进,直到end。这个简单的函数就是这样做的:-)

代码语言:javascript
复制
const range = (start, end, step = 1) => {
  let result = [];
  for(let i=0; i<=end; i+=step) {
    result.push(i);
  }
  return result;
};

这里的好处是,您可以使用十进制步长值。

例如:

代码语言:javascript
复制
range(0, 2, 0.5) // [ 0, 0.5, 1, 1.5, 2 ]
range(0,100,20) // [ 0, 20, 40, 60, 80, 100 ]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47190001

复制
相关文章

相似问题

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