我有两个号码min
和max
,我想创建一个包含它们之间所有数字的数组(包括min
和max
)。
最明显的方法是使用for
循环,并将push
单个值放到数组中。然而,这似乎是一种非常天真的方法,即它的命令式编程。
现在我在考虑如何以更实用的方式创建这样的数组。基本上,诸如reduce
函数的反转之类的东西:不是将数组减少为数字,而是从两个数字构建数组。
我怎么能这样做?什么是解决这个问题的功能方法?
基本上,我在某些其他语言中考虑10..20
之类的内容。什么是JavaScript中最优雅的等价物?
答案 0 :(得分:4)
受this启发
var min = 3, max = 10;
var x = Array.apply(null, {length: max + 1}).map(Number.call, Number).slice(min);
console.log(x);
// [ 3, 4, 5, 6, 7, 8, 9, 10 ]
最佳版本
var min = 3, max = 10;
var x = Array.apply(null, {length: max + 1 - min}).map(function(_, idx) {
return idx + min;
});
console.log(x);
// [ 3, 4, 5, 6, 7, 8, 9, 10 ]
答案 1 :(得分:4)
你可以想到一个"功能性"范围的定义:
range(low, hi) = [], if low > hi
range(low, hi) = [low] (+) range(low+1,hi), otherwise,
导致JS定义:
function range(low,hi){
function rangeRec(low, hi, vals) {
if(low > hi) return vals;
vals.push(low);
return rangeRec(low+1,hi,vals);
}
return rangeRec(low,hi,[]);
}
答案 2 :(得分:1)
如果你有和声发生器,你可以使用它:
function* range(lorange,hirange){
var n = lorange;
while (n <= hirange){
yield n++;
}
}
rval= range(3,6);
现在你可以:
使用for-of comprehension作为迭代器替换数组
for (i of rval)
console.log(i);
3
4
5
6
或者你可以用它来创建一个你想要的数组
rarray = [];
for (i of rval)
rarray.push(i);
答案 3 :(得分:0)
单线方式。灵感来自How to create an array containing 1...N。
Array.from({length: max-min+1}, (_, i) => i + min);
从基于最大值和最小值的计算长度开始一个数组。然后通过“index + min”函数映射每个索引值。引用是 here。
示例:
const min = 12;
const max = 20;
const arr = Array.from({length: max-min+1}, (_, i) => i + min);