创建一个数组,其中包含从最小到最大的所有数字,没有循环

时间:2014-03-18 10:15:30

标签: javascript arrays node.js functional-programming

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

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

现在我在考虑如何以更实用的方式创建这样的数组。基本上,诸如reduce函数的反转之类的东西:不是将数组减少为数字,而是从两个数字构建数组。

我怎么能这样做?什么是解决这个问题的功能方法?

基本上,我在某些其他语言中考虑10..20之类的内容。什么是JavaScript中最优雅的等价物?

4 个答案:

答案 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);

现在你可以:

  1. 使用for-of comprehension作为迭代器替换数组

    for (i of rval)
    console.log(i);
    
    3
    4
    5
    6
    
  2. 或者你可以用它来创建一个你想要的数组

    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);