Недавно от коллег пришла задача - заполнить javascript-массив определенной последовательностью чисел без явного использования цикла.
То есть в простейшем случае требуется получить массив вида:
Естественно, используя цикл
Но мы пойдем другим путем.
Для начала повнимательнее изучим информацию о создании и инициализации массива. В параграфе Синтаксис можно заметить, что в конструктор
Итак, у нас есть массив с пятью пустыми элементами.
Теперь можно попробовать пройтись по массиву и заполнить его нужными данными. Обычно для это используется метод
Здесь в виде стрелочной функции объявлен колбек, который получает на вход значение
Отлично, на данном шаге мы видим что массив заполнен пятью единичками. Цепляем вызов map и получаем итоговый код:
И, конечно же, в качестве map-колбека можно установить любую нужную функцию.
Формально задача выполнена, явного цикла нет. Однако, если в цикле
То есть в простейшем случае требуется получить массив вида:
[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
мы прошлись по массиву только один раз, то в данном коде - как минимум два (возможно, третий проход выполняется при заполнении массива пустыми элементами). Стоит ли менять первое решение на второе - решать вам.
Комментариев нет:
Отправить комментарий