Gol*_*den 2 javascript arrays functional-programming node.js
我有两个数字min
和max
,我想创建一个数组,其中包含它们之间的所有数字(包括min
和max
)。
最明显的方法是为此使用for
循环,并将push
单个值存储到数组中。然而,这似乎是一种非常幼稚的方法,即它是命令式编程。
现在我正在考虑如何以更实用的样式创建这样的数组。基本上,是诸如reduce
函数逆向这样的事情:不是将数组简化为一个数字,而是从两个数字构建一个数组。
我该怎么办?解决此问题的功能方法是什么?
基本上,我在考虑10..20
其他语言。在JavaScript中,最优雅的等效词是什么?
灵感来自这
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 ]
Run Code Online (Sandbox Code Playgroud)
最佳版本
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 ]
Run Code Online (Sandbox Code Playgroud)
一种单行方式。受到如何创建包含 1...N 的数组的启发。
Array.from({length: max-min+1}, (_, i) => i + min);
根据基于最大值和最小值的计算长度启动数组。然后通过“index + min”函数映射每个索引值。参考资料在这里。
例子:
const min = 12;
const max = 20;
const arr = Array.from({length: max-min+1}, (_, i) => i + min);
Run Code Online (Sandbox Code Playgroud)
您可以想到范围的“功能”定义:
range(low, hi) = [], if low > hi
range(low, hi) = [low] (+) range(low+1,hi), otherwise,
Run Code Online (Sandbox Code Playgroud)
由此得出 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,[]);
}
Run Code Online (Sandbox Code Playgroud)