С заполнением диапазоном чисел на ES6

Задачка очень старая. Были времена, когда ее спрашивали на собеседованиях. Сейчас вряд ли кто-то всерьез будет спрашивать про нее на техническом интервью, но в жизни и быту она периодически встречается. А суть задачи проста: создать массив N размерности и заполнить его числами от 0 до N.

Раньше для этих целей использовали сложную конструкцию вида:

let n = 10
const arr = Array.apply(null,{length:n}).map(Number.call, Number)

Что тут происходит? Мы создаем array-like объект — это объект у которого обязательно присутствует атрибут length. Таким образом объект {length: n} — это array-like объект, но это не Array!

А далее “магия” которую легко распутать, достаточно понимать как устроены классы и объектв в JS и что за метод call. В итоге получаем массив с заполнением:

[0,1,2,3,4,5,6,7,8,9]

Отчасти эта задача и была интересна для собеседования своей “магией”. Если человек мог написать такую конструкцию и объяснить что тут просиходит — он точно знал как работает call, чем отличается от apply, что такое array-like объект, как устроен класс Array в JS и так далее. Сейчас это уже не обязательно, ведь у нас есть ES6+.

ES6 синтаксис

С приходом ES6 задача стала скучна, а реализация стала более читаемая и идиоматична. Теперь эта же задача может быть решена таким образом:

const arr = [...Array(n)].map((_,i)=>i)

Спред оператор можно заменить на Array.from(), например и тому подобные:

const arr = Array.from(Array(n)).map((_,i)=>i)

В итоге задача сошла на нет и ее уже редко где встретишь на собеседовании. А были времена, когда меня такое спрашивали и были времена, когда я не мог ответить на этот вопрос 🙂

Если покопаться, можно найти еще разновидности, но они будут повторять эти базовые концепции. Просто будут другие методы и способы инициализации стартового экземпляра Array.

Array.keys()

Вот еще интересный вариант инициализации массива:

const arr = [...Array(n).keys()]

UPD

Небезызвестный Сергей Рубанов мне напомнил, что Array.from принимает 2й необязательный аргумент. Так что педпоследний пример можно переписать так:

const arr = Array.from(Array(n), (_, i) => i)

или так

const arr = Array.from({ length: n}, (_, i) => i)