При изучении JavaScript есть некоторые моменты, когда вы изучаете что-то, что не только увеличивает вашу продуктивность, но и увеличивает ее в геометрической прогрессии.
Изучение Underscore было для меня одним из таких моментов. Это был мой первый контакт с концепциями функционального программирования, и это уже само по себе большое дело®.
Underscore - это набор служебных функций, которые освобождают вас от боли, связанной с вложенными «for» и «if», позволяя аккуратно организовать свои алгоритмы в данные и преобразования, которые вам необходимо применить. к данным.
Если вы никогда не касались Underscore или функционального программирования, не бойтесь! Позвольте мне направить вас к вашим первым шагам на этом долгом и полезном пути. Обещаю, вы не будете разочарованы.
Ваши новые лучшие друзья - каждый, сопоставьте и уменьшите
Наиболее важными и часто используемыми из этих функций являются:
- каждый,
- карта и
- уменьшить.
На самом деле они настолько мощны, что большинство других операций может быть выражено через них. Давайте сначала познакомимся с ними, потому что они являются строительными блоками для функционального мышления.
Каждый, скучный брат
each является эквивалентом простого for. Он получает массив, перебирает его значения и применяет к ним заданную функцию.
На простом JS вы должны написать:
Что-то здесь неприятно. Во-первых, вам нужно разобраться с итерацией самостоятельно, помня о i и значении, которые являются лишь средством для достижения цели. Во-вторых, ваша трансформация застряла в петле. Он должен быть многоразовым! Давайте сначала исправим это:
Хорошо, стало немного лучше. Но с each все становится еще проще:
Хорошо смотритесь! Но есть нюанс ...
Побочные эффекты - зло
В нашем первом простом примере мы изменили тот же массив, который нам дали. Это может показаться безобидным, но одно из достоинств функционального программирования, которое вы полюбите, - это неизменность ценностей.
Это уродливое имя просто означает, что значения не следует изменять, а лучше использовать для генерации других значений. Вы узнали это из математики: функция отображает одно значение в другое. Он никогда не изменяет оригинал.
f(x) -> x * 2 a = 2 f(a) // results 4; a is still 2, of course.
Вернемся к нашему примеру
Итак, лучшая реализация нашего простого примера с удалением побочных эффектов:
В стороне - почему чистота так важна
Функция, не имеющая побочных эффектов, называется чистой функцией. Они важны по ряду причин, но самое главное: поскольку они не меняют никакого состояния, они очень предсказуемы. Это упрощает рассуждение о вашем коде.
Это также означает, что чистые функции легко тестируются! При одинаковых аргументах они всегда будут возвращать один и тот же результат. Подробнее о функциональном программировании.
Сопоставьте эти значения
Итак, теперь мы знаем, что не следует изменять эти объекты, вероятно, сейчас самое время познакомиться с картой. Он получает массив, выполняет итерацию по его содержимому, применяя преобразование, и возвращает новый массив с преобразованными значениями.
Давайте сделаем этот последний неуклюжий пример лучше!
Ух ты. Вы уже это чувствуете?
Уменьшить все
Иногда вас интересуют не отдельные лица, а совокупная ценность. Именно для этого и предназначен reduce. Он уменьшает все значения в коллекции до одного значения.
Он получает массив, функцию и начальное значение. Функция iteratee немного сложнее - она получает сначала частичный результат, а затем текущее значение. Это лучше понять на примере.
Для каждого игрока в массиве reduce вызовет totalPoints. В первый раз он будет использовать начальное значение в качестве первого параметра. Последовательные вызовы будут использовать результат предыдущего вызова.
Итак, вот оно. Вы можете использовать уменьшить, когда хотите собрать информацию обо всех значениях из коллекции и создать что-то еще из нее.
Вывод
Это было очень краткое введение в некоторые из основных инструментов набора инструментов Underscore. Однако есть еще много чего узнать, и одни только эти функции имеют гораздо более интересные приложения.
Надеюсь, вам понравилось, и вы не пожалеете, пока не перейдете к следующей части, где мы обсудим создание цепочек, использование объектов вместо массивов и некоторые более продвинутые функции.
Вы всегда можете сразу начать работу с отличной документации, а также познакомиться с lodash, самым худым и подлым младшим братом Underscore.
ОБНОВЛЕНИЕ Некоторые люди указали, что я должен упомянуть, что современные браузеры предлагают встроенные реализации forEach, map и reduce в качестве методов Array. Только будьте осторожны с их использованием, если вы планируете поддерживать старые браузеры, так как вам нужно будет полифилить их!
Первоначально опубликовано на сайте firstdoit.com 22 сентября 2014 г.