Start and end range array count in increments of 1

hi,

So I have 2 numbers 1 and 10, I want to count these in my dropdown in increments of 1
Here is my code so far:

html (angular)

<option *ngFor="let i of yearRange(5, 100)" [value]="i">{{i}}</option>

function is. complaining about .fill()

yearRange(start: number, end: number): number[] {
    return Array(end - start + 1).fill().map((_, idx) => start + idx);
  }

when I remove the .fill() I get a loop but the outputs are blank

I think I managed it here

yearRange(start: number, end: number): number[] {
    return Array(Math.ceil((end - start) / 1)).fill(start).map((x, y) => x + y * 1)
  }

Hi,

You can use Array.from() to generate a sequence of numbers:

Array.from({ length: 5 }, (_, i) => i);
// [0, 1, 2, 3, 4]

This can easily be adapted to accept a start and end parameters:

function range(start, end) {
  const length = end - start;
  return Array.from({ length }, (_, i) => start + i);
}

range(5, 10);
// [5, 6, 7, 8, 9]

And turned into a handy one liner:

const range = (start, end) => Array.from({ length: end - start }, (_, i) => start + i);

range(95, 100);
// [ 95, 96, 97, 98, 99 ]

In your case that would translate to:

yearRange(start: number, end: number): number[] {
  return Array.from({ length: end - start }, (_, i) => start + i);
}

Which will probably be a bit easier to understand the next time you revisit the code.

3 Likes

Another alternative is to use the keys of a generated array with a spread.
[...Array(end-start).keys()]
< [0,1,2,3]
(I specified end as 5 and start as 1)
But, multiple ways to skin the cat.

1 Like

Good, bad? I don’t know, but playing with generators sometime ago

const rangeIterable = function* (x, y) { while (x < y) yield x++ }

const range = (x, y) => [...rangeIterable(x, y)]

console.log(range(4,10))
// [4,5,6,7,8,9]

could be uglified into one line

const range = (x, y) => [...function* () { while (x < y) yield x++ }()]
2 Likes

Unless I’m missing something, that will always produce a range from 0 to whatever.

const start = 95;
const end = 100;

console.log([...Array(end-start).keys()]);
// [ 0, 1, 2, 3, 4 ]

When what the OP wants is: [ 95, 96, 97, 98, 99 ]

To achieve the desired result, we could just chain a map on the end:

console.log([...Array(end-start).keys()].map(i => i + start));
// [ 95, 96, 97, 98, 99 ]
1 Like