[БЕЗ_ЗВУКА] Как я уже говорил, функции в JavaScript являются объектами высшего порядка. Это означает то, что мы можем передавать функцию в качестве входного аргумента в другую функцию и использовать ее внутри него, и то, что, как и объект, любая функция может обладать личными свойствами. Возьмем наш массив с твиттами, но теперь каждым его элементом будет не просто строчка, а объект, представляющий структуру данных со списком хэштегов, с данными об авторе, ну и, конечно же, текстом твитта. Для итерирования по этому массиву существует более изящный способ, нежели оператор for, который мы рассмотрели ранее, это метод forEach, он существует у каждого массива и на вход он принимает так называемую функцию обратного вызова. Эта функция в качестве первого аргумента принимает текущий элемент массива, на котором находится наш шаг итерации, а в качестве второго — индекс, на котором находится сейчас наша итерация по массиву. И уже внутри этой функции мы можем точно так же, как и внутри оператора for, отфильтровать необходимые для нас значения. И сейчас мы проверяем на то, что наше поле «хэштег» у объекта, на который мы сейчас итерируемся, является массивом, и то, что внутри этих хэштегов, внутри этого массива, есть строчка со значением wstdays, и так же, как и ранее, добавляем наш объект в список result. Как это будет работать под капотом? У нас будет функция forEach, внутри которой будет доступно ключевое свойство this. Более подробно о нем мы будем говорить в следующих лекциях. Сейчас нам важно знать только то, что в данном конкретном случае это значение будет ссылаться на наш массив, по которому мы итерируемся. Внутри него будет все тот же оператор for с циклом по всему массиву, и мы на каждом шаге будем вызывать нашу функцию, в нашем случае это функция фильтрации, и передавать в нее в качестве первого аргумента элемент массива для нашего шага итерации и наш индекс шага итерации. Итак, у нас есть массив, у которого есть функция forEach, внутрь которой мы передаем другую функцию и внутри которой обрабатываем нашу логику. Таких функций у массива достаточно много, и конкретно для фильтрации элементов массива существует специальная функция filter, которая также принимает на вход функцию. Перечень аргументов у нее такой же: первым параметром — текущий элемент массива, вторым параметром — индекс. И эта функция должна нам вернуть true или false, в зависимости от того, удовлетворяет наш элемент массива нашему условию или нет. И в результате мы получим массив, состоящий только из элементов, которые удовлетворяют условию и для которых наша функция обратного вызова, то есть функция фильтрации, вернула true. Также работы с массивами существует очень полезный метод map, который позволяет спродуцировать на основе одного массива другой массив аналогичной длины, но со значениями, которые будут получены в качестве обработки каждого элемента первоначального массива. Точно так же, как и другие методы, он принимает на вход функцию обратного вызова, первым параметром, который будет идти, — элемент массива на каждом шаге итерирования и индекс итерирования, на котором мы сейчас находимся. Далее мы должны вернуть новый элемент, который в новом созданном массиве будет помещен на этот же самый индекс. И что делаем мы? Мы берем наш объект твитта в виде объекта и пытаемся преобразовать его в строчку, являющуюся HTML-кодом. Этот HTML-код будет представлять из себя тег dt, в котором будет заголовок твитта, и теги dd, которые будут являться дополнительной информацией. Хештеги мы соединим друг с другом с помощью метода join, который также есть у любого массива, который на вход принимает строчку и с помощью этой строчки конкатенирует все элементы массива, склеивая их этим элементом. Таким образом, мы возьмем все хештеги, если таковые есть, и соединим их через запятую. В итоге мы сгенерируем одну большую строчку из тегов dt, dd, которую вернем на каждом шаге итерирования. На основе этих строчек будет спродуцирован новый массив аналогичной длины, но уже состоящий из строк. Самым главным полезным свойством JavaScript и работы с массивами в JavaScript является то, что функции для работы с массивами можно вызывать друг за другом в цепочке. Это очень удобно и позволяет сделать вам очень простой лаконичный код, который легко и приятно читать. Каждая функция возвращает массив, и после этого вы вызываете другую функцию, но уже относительно этого массива, который вернула предыдущая функция. Таким образом, мы берем массив твиттов, наш изначальный, фильтруем его сначала по нашему критерию тега wstdays, после этого на основе уже отфильтрованного массива мы генерируем наш массив из строчек появляющихся HTML-кодом, а после этого с помощью оператора join соединяем все эти строчки в одну большую с помощью операции конкатенации. И добавляем слева и справа от полученной строки начальные теги для обрамления. В итоге за три строчки кода и несколько разделенных отдельной функций мы сгенерировали наш HTML-код для построения списка нашего твитта. Этот код удобно читать, его удобно поддерживать, и он разделен на отдельные функции. В следующей главе мы рассмотрим функцию reduce, которая позволяет также производить множество полезных и удобных действий для работы с массивами.