Знание того, как работать с коллекциями данных в Javascript, является фундаментальным набором навыков, которым должен овладеть каждый разработчик. Даже в повседневной жизни мы постоянно работаем с данными — пишем список покупок, обновляем контакт в нашей адресной книге или отмечаем что-то в нашем списке TODO, мы постоянно получаем доступ к данным и манипулируем ими. Так что неудивительно, что когда мы программируем, это тоже встречается довольно часто!

К счастью, Javascript предоставляет нам множество различных инструментов для этого. В этом посте будут обобщены некоторые из наиболее распространенных итераторов в Javascript и когда их использовать. Прежде чем перейти к ним, что такое итерация? Согласно определению школы Flatiron:

Итерация — это процесс выполнения набора инструкций один раз для каждого элемента коллекции.

В качестве небольшого отступления, вы можете задаться вопросом — а как насчет циклов? Ну, ключевой нюанс заключается в том, что цикл будет выполняться до тех пор, пока не будет выполнено определенное условие, а итерация будет выполняться для каждого элемента в объекте или массиве. Это означает, что методы итераторов дают нам удобный способ работы с данными во всей коллекции без необходимости выполнять дополнительную работу, необходимую в циклах for (например, инициализировать счетчик, увеличивать его и обеспечивать выход из цикла). петля). Yay для чистого и лаконичного кода!

.находить()

Допустим, у нас есть множество наших любимых пиццерий Нью-Йорка, и мы хотим найти первую, которая начинается с буквы «R».

const pizzerias = ["Paulie Gee's", "Roberta's", "Lucali", "Arturo's", "Denino's", "Ray's", "john's"]

Метод find будет перебирать каждый элемент в массиве, вызывать для него функцию обратного вызова и возвращать первый элемент в массиве, который соответствует условию, определенному функцией. (undefined возвращается в случае, если элемент не найден.) В функцию обратного вызова автоматически передаются три аргумента: текущий элемент массива, индекс текущего элемента и сам массив. (Обратите внимание, требуется только аргумент element.) Затем мы можем определить нашу функцию обратного вызова с этими аргументами в качестве параметров и использовать их для определения наших условий внутри этой функции.

Мы можем определить функцию обратного вызова, которая проверяет, является ли первая буква переданной ей строки «R», следующим образом:

function startsWithR(element) {
  const elementLowered = element.toLowerCase()
  return elementLowered.startsWith('r')
}

Теперь, когда у нас есть функция обратного вызова, мы можем использовать метод .find() для нашего массива pizzeria:

const rPizza = pizzerias.find(startsWithR)
console.log(rPizza) // => "Roberta's"

.фильтр()

Скажем, например, мы хотим найти не первый элемент, отвечающий определенному условию в нашем массиве, а все из них. Удобный способ сделать это с помощью метода .filter(), который принимает в качестве аргумента функцию обратного вызова, которая будет вызываться для каждого элемента массива. Для каждого элемента, переданного обратному вызову, если возвращаемое значение обратного вызова равно true, этот элемент копируется в новый массив, а возвращаемое значение является новым массивом.

Давайте посмотрим на это в действии. Возвращаясь к нашему предыдущему примеру с массивом pizzerias, скажем, мы хотим получить все пиццерии, которые начинаются с буквы «R», а не только первую. Мы можем использовать ту же функцию обратного вызова startsWithR, которую мы написали ранее, но на этот раз с filter.

const rPizzas = pizzerias.filter(startsWithR)
console.log(rPizza) // => ["Roberta's", "Ray's"]

.карта()

Мы рассмотрели несколько способов получить определенные элементы в нашем массиве, но что, если мы захотим их изменить? Введите .map() ! Аналогично find и filter , map принимает функцию обратного вызова. Для каждого элемента в массиве map передаст его функции обратного вызова, которая выполняет какое-то преобразование, а затем вернет новый массив со всеми измененными элементами.

Возвращаясь к нашему надежному (и жесткому) примеру массива pizzerias, предположим, что мы хотим убедиться, что наш массив правильно отформатирован, чтобы первая буква каждой строки была в верхнем регистре. Мы можем написать простую функцию обратного вызова, например:

function upperCaseFirst(element) {

const capitalized =
  element.charAt(0).toUpperCase()
  + element.slice(1)
return capitalized
}

Теперь, когда у нас есть обратный вызов, мы можем вызвать map для нашего массива pizzerias, получив новый красиво отформатированный массив.

const capitalizedPizzerias = pizzerias.map(upperCaseFirst)
console.log(capitalizedPizzerias) // => ["Paulie Gee's", "Roberta's", "Lucali", "Arturo's", "Denino's", "Ray's", "John's"]

Поиск, фильтрация и сопоставление — очень распространенные и полезные методы итератора для работы с данными и управления ими в Javascript. Для дальнейшего чтения ознакомьтесь с (чуть более сложным) методом reduce. Спасибо за чтение!