创建一个数组,从最小到最大的所有数字都没有循环

Gol*_*den 2 javascript arrays functional-programming node.js

我有两个数字minmax,我想创建一个数组,其中包含它们之间的所有数字(包括minmax)。

最明显的方法是为此使用for循环,并将push单个值存储到数组中。然而,这似乎是一种非常幼稚的方法,即它是命令式编程。

现在我正在考虑如何以更实用的样式创建这样的数组。基本上,是诸如reduce函数逆向这样的事情:不是将数组简化为一个数字,而是从两个数字构建一个数组。

我该怎么办?解决此问题的功能方法是什么?

基本上,我在考虑10..20其他语言。在JavaScript中,最优雅的等效词是什么?

the*_*eye 5

灵感来自

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)

  • 似乎过于复杂。一个for循环也可以完成这项工作,减去了无用的复杂性。 (2认同)

jum*_*net 5

一种单行方式。受到如何创建包含 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)


Mau*_*Mau 4

您可以想到范围的“功能”定义:

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)

  • @thefourtheye:是的,这会更实用(然后你应该将 `rangeRec` 移到 `range` 之外),但是在每次迭代上创建一个新数组会大大减慢它的速度(`O(n²)` 运行时间) (2认同)