是否有任何ECMAScript 6/7等效于下划线的range函数?
下划线:
_.range(startPage, endPage + 1);在ES2015中:
Array.from(Array(n), (_, i) => x + i)不确定ES2015版本是如何工作的。我想知道javascript的ecmascript中的范围是如何工作的
发布于 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添加到当前索引将创建范围内的数字。
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));
此版本还将处理反向范围(大小不等):
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));
发布于 2019-12-22 17:09:34
请注意,以下实现不允许延迟生成列表:
Array.from(Array(n), (_, i) => x + i)假设您需要一个100万个数字的列表:
range(1, 1000000);你要把它们全吃光吗?也许没有,但是所有的数字都已经生成了,它们可能在你的记忆中留下了一个重要的足迹。
如果我们能按要求一个接一个地给他们买,那就太好了。
事实证明,我们完全可以用发电机做到这一点:
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)钻头了吗?
在一个所有数字都是预先生成的典型实现中,这段代码甚至不会运行,因为您将陷入无限生成数字的循环中。
发布于 2022-10-19 06:56:02
据我所知,range方法从start开始生成一个数字数组,使用step (默认值= 1)步进,直到end。这个简单的函数就是这样做的:-)
const range = (start, end, step = 1) => {
let result = [];
for(let i=0; i<=end; i+=step) {
result.push(i);
}
return result;
};这里的好处是,您可以使用十进制步长值。
例如:
range(0, 2, 0.5) // [ 0, 0.5, 1, 1.5, 2 ]
range(0,100,20) // [ 0, 20, 40, 60, 80, 100 ]https://stackoverflow.com/questions/47190001
复制相似问题