Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create an array with all numbers from min to max without a loop

I have two numbers, min and max, and I want to create an array that contains all number between them (including min and max).

The most obvious approach is to use a for loop for this, and push the single values onto an array. Nevertheless, this seems to be a quite naive approach, i.e. it's imperative programming.

Now I was thinking of how to create such an array in a more functional style. Basically, something such as the reverse of a reduce function: Instead of reducing an array to a number, building up an array from two numbers.

How could I do this? What is a functional approach to solve this problem?

Basically, I'm thinking of something such as 10..20 in some other languages. What's the most elegant equivalent for this in JavaScript?

like image 440
Golo Roden Avatar asked Mar 18 '14 10:03

Golo Roden


People also ask

How do you create an array?

Obtaining an array is a two-step process. First, you must declare a variable of the desired array type. Second, you must allocate the memory to hold the array, using new, and assign it to the array variable. Thus, in Java, all arrays are dynamically allocated.

What does array MIN () do?

min() function returns the smallest of zero or more numbers. The destructuring assignment syntax is a JavaScript expression that makes it possible to extract data from arrays or objects into distinct variables.


5 Answers

Inspired by 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 ]

The optimum version

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 ]
like image 191
thefourtheye Avatar answered Oct 05 '22 01:10

thefourtheye


You can think of a "functional" definition of range:

range(low, hi) = [], if low > hi
range(low, hi) = [low] (+) range(low+1,hi), otherwise,

which leads to the JS definition:

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,[]);
}
like image 25
Mau Avatar answered Oct 05 '22 02:10

Mau


A one line way. Inspired by How to create an array containing 1...N.

Array.from({length: max-min+1}, (_, i) => i + min);

Initiate an array from a computed length based on max and min. Then map each index value by a function which is "index + min". The reference is here.

Example:

const min = 12;
const max = 20;
const arr = Array.from({length: max-min+1}, (_, i) => i + min);
like image 45
juminet Avatar answered Oct 05 '22 02:10

juminet


If you have harmony generators you can use this:

function* range(lorange,hirange){
  var n = lorange;
  while (n <= hirange){
    yield n++;
  }
}

rval= range(3,6);

Now you can :

  1. Use the for-of comprehension for iterators as substitute of array

    for (i of rval)
    console.log(i);
    
    3
    4
    5
    6
    
  2. Or you can use it to create an array like you want

    rarray = [];
    for (i of rval)
    rarray.push(i);
    
like image 25
user568109 Avatar answered Oct 05 '22 03:10

user568109


Might be late to the party, but, based on this (es6)

const rangexy = (start, end) => Array.from({length: (end+1 - start)}, (v, k) => k + start);
like image 29
aazev Avatar answered Oct 05 '22 02:10

aazev