среда, 23 мая 2018 г.

Заполнение массива числами.

Недавно от коллег пришла задача - заполнить javascript-массив определенной последовательностью чисел без явного использования цикла.

То есть в простейшем случае требуется получить массив вида:

[1,2,3,4,5]

Естественно, используя цикл for можно все сделать просто и понятно, например:

var a = [];
for (i = 1; i <= 5; i++) {
    a.push(i)
}


Но мы пойдем другим путем.

Для начала повнимательнее изучим информацию о создании и инициализации массива. В параграфе Синтаксис можно заметить, что в конструктор Array() можно передать первым аргументом число, и длина создаваемого массива установится равной этому числу. Таким образом, чтобы создать массив необходимой длины, можно написать:

Array(5)

Итак, у нас есть массив с пятью пустыми элементами.
Теперь можно попробовать пройтись по массиву и заполнить его нужными данными. Обычно для это используется метод map. Попробуем написать так:

Array(5).map((v, i) => i + 1)

Здесь в виде стрелочной функции объявлен колбек, который получает на вход значение v и индекс i из текущей позиции массива и возвращает значение индекса, увеличенное на единицу. Но, что-то идет не так и результат остается прежним: массив из пяти пустых элементов. Видимо, итерировать массив из пустых элементов нельзя. Давайте заполним массив чем-либо. В этом нам поможет функция fill (обратите внимание, что она недоступна для IE, но доступна в Edge):

Array(5).fill(1)

Отлично, на данном шаге мы видим что массив заполнен пятью единичками. Цепляем вызов map и получаем итоговый код:

Array(5).fill(1).map((v, i) => i + 1)

И, конечно же, в качестве map-колбека можно установить любую нужную функцию.

Формально задача выполнена, явного цикла нет. Однако, если в цикле for мы прошлись по массиву только один раз, то в данном коде - как минимум два (возможно, третий проход выполняется при заполнении массива пустыми элементами). Стоит ли менять первое решение на второе - решать вам.

Комментариев нет:

Отправить комментарий