При изучении 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 г.