'reduce the size of a javascript array while keeping members that are evenly distributed in the original

Hard to put into words but I am looking for a function that takes an array and reduces it down to a given size. The use case is specifying ticks for graph in d3.

 const availableDatetimes: Date[] = [...]
 const numberOfXTicks = chartWidth / 80
 const tickValues = reduceArrSize(availableDatetimes, numberOfXTicks)

the result should have evenly distributed dates



Solution 1:[1]

I called it shrinkArray(), because reducing an array is the name of a different well-defined operation. Here it is:

const shrinkArray = (array, size) => {
    const step = array.length / size
    return array.filter((v, i) => Math.floor(i % step) == 0)
}

Let's shrink an array of size 100 to size 33:

const originalArray = (new Array(100).fill(0)).map((v, i) => i)

const shrunkenArray = shrinkArray(originalArray, 33)
console.log(shrunkenArray);
console.log(shrunkenArray.length == 33);

So:

[
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
  12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
  24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
  36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
  72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
  84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  96, 97, 98, 99
]

is shrunken to:

[
   0,  4,  7, 10, 13, 16, 19, 22, 25,
  28, 31, 34, 37, 40, 43, 46, 49, 53,
  56, 59, 62, 65, 68, 71, 74, 77, 80,
  83, 86, 89, 92, 95, 98
]

that is of size 33.

In this example the array is integers from 0 to 99, but obviously the function works for any data type.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 re-za