Предотвращаем блокировку контактов в WhatsApp
У меня были проблемы с пониманием reduce( ) и рекурсии в JavaScript, так что я написал эту статью чтобы объяснить их в первую очередь себе (эй, смотрите, это же рекурсия!). Эти концепции имеют некоторые сходства с приготовление яблочного пирога. Я очень надеюсь вы сочтёте мои примеры как полезными так и аппетитными.
Дан массив содержащий вложенныу массивы:
Как результат мы хотим получить:
Использование цикла for и оператора if.
Если мы знаем максимальное количество вложенных массивов, с которыми нам предстоит работать (в примере их 4), то нам вполне подойдёт цикл for для итерации по каждому элементу массива, а затем оператор if, чтобы проверить является ли этот элемент самим массивом, и так далее...
Что в принципе работает, но тяжело как для чтения, так и для понимания. Более того это работает только в случае, когда известно количество вложенных массивов. И вы вообще можете вообразить каково дебажить весь это бардак (даже сейчас кажется что я где-то лишнее i поставил).
Использование reduce.
К счастью у JavaScript есть пару методов для того чтобы сделать наш код понятнее и проще. Один из таких методов reduce( ). И выглядеть это всё будет вот так:
Получилось куда меньше кода, но мы пропускаем некоторые (в нашем примере один) вложенные массивы. Давайте вместе пошагово разберём как работает reduce ( ) и посмотрим что же он всё-таки делает, чтобы исправить это.
Array.prototype.reduce()
Это не так сложно, как кажется. Давайте поговорим о reduce ( ) как о чём-то вне работы разработчика. Знакомьтесь, это Адам. Основная функция Адама состоит в том, чтобы взять яблоки из кучи, помыть их, а затем поместить одно за другим в корзину. Эта корзина блестящих яблок предназначена для того, чтобы стать вкусными яблочными пирогами. Это очень важная работа.
Яблоки + Человеческие усилия = Пирог. Не путайте формулу с рецептом яблоко-человеческого пирога, он не столь вкусны.
В приведённом выше примере куча яблок — это наш массив arr. Корзина — это переменная done, аккумулятор. Начальным значением done является пустой массив, который мы видим как [] последним параметром нашего reduce( ). Яблоко, которое Адам в данный момент моет — это curr (от current). Как только Адам заканчивает мыть текущее яблоко он кладёт его в корзину (мы делаем это с помощью .concat( ) ). Когда гора яблок заканчивается Адам отдаёт корзину с чистыми яблоками нам и идёт домой к своему коту.
Использование reduce( ) рекурсивно для обращения к вложенным массивам.
Ну что же, по итогу работы Адама мы имеем корзину чистых яблок и всё, вроде бы даже отлично. Но нам всё ещё нужно разобраться с этими вложенными массивами. Возвращаясь к нашей аналогии: предположим что некоторые яблоки были настолько хороши, что они упакованы в отдельные коробки ещё при продаже. Внутри каждой коробки могут быть ещё яблоки и ещё коробки, содержащие яблоки и коробки поменьше.
Прелестные, слегка перекошенные яблоки просто хотят быть любимыми / съеденными.
Вот что мы хотим от нашей яблоко-обрабатывающей функции/Адама:
- Если куча яблок это куча яблок, то возьми яблоко из кучи.
- Если то что ты взял — это яблоко, то мой его и клади в корзину.
- Если то что ты взял — коробка, то открой коробку. Если в коробке яблоко иди к шагу 2.
- Если же в коробке другая коробка, то иди к шагу 3.
- Когда от кучи яблок не осталось и следа отдай нам корзину.
- Если куча яблок совсем не куча яблок, то отдай это, чем бы они ни было.
Рекурсивная функция с reduce( ) будет выглядеть так:
Терпение и я всё объясню.
Рекурсия
Если вы посмотрите на наш код выше, вы увидите, что flatten () появляется дважды. В первый раз, когда он появляется, он говорит Адаму, что делать с кучей яблок. Во второй раз он рассказывает ему, что делать с тем, что он сейчас держит, давая указания в случае, если это яблоко и в случае, если это не яблоко. Следует отметить, что эти инструкции являются повторением первоначальных инструкций, с которых мы начали — и это рекурсия.
Для ясности разберём всё строчка за строчкой:
- function flatten(arr) { — мы называем нашу общую функцию и указываем что она примет аргумент arr.
- if (Array.isArray(arr)) { — мы проверяем является ли полученное массивом.
- return arr.reduce(function(done,curr){ — если предыдущая строка возвращает true и аргумент является массивом вы передаём его в reduce ( ) — это наш рекурсивный регистр.
- return done.concat(flatten(curr)); — неожиданный поворот сюжета! Функция, которую мы вызываем — это та самая функция в которой мы находимся сейчас. Вкратце: начинайте заново с самого верха.
- }, []); — мы говорим нашей функции reduce начинать с пустого аккумулятора (done) и помещать то, что вернёт функция именно в него.
- } else { — это разрешает те случае когда строка 2 возвращает false, то есть когда аргумент не является массивом.
- return arr; — вернуть то, чему бы arr не было бы равно (предположительно чистому яблоку). Это уже на базовый регистр, который выводит нас из рекурсии.
- } — завершение блока else.
- } — завершение общей функции.
И мы закончили! Мы перешли от 24-строкового, 4-слойного-вложенного цикла for к более сжатому и лаконичному 9-строчному рекурсивному решению. Reduce и рекурсия могут поначалу показаться сложными для понимания, но это ценные инструменты которые в будущем сэкономят вам множество усилий как только вы их поймёте.
И не беспокойтесь об Адаме, нашем неработающем разработчике. Он получил так много внимания после этой статьи, что он открыл свою собственную фабрику яблочных пирогов, управляемую AI. Он очень доволен.
+1 вам, если ожидали шутку про Адамово Яблоко.
Впервые делаю перевод статьи от того буду благодарен за любые правки, исправения и указание на недочёты.
- Оригинал статьи. Vicky Lais Blog
- MDN
ссылка на оригинал статьи https://habrahabr.ru/post/330006/
MAYKOR обсудила возможности повышения экспорта ИТ-компаний Москвы MAYKOR , общероссийский поставщик услуг в области аутсорсинга ИТ- и бизнес-процессов, приняла участие в совещании Департамента науки, промышленной политики и предпринимательства города Москвы c ИТ-компаниями по программе повышения экспорта. Мероприятие состоялось 8 февр...
Хакеры майнили криптовалюту с помощью корпоративных ресурсов Tesla Несколько месяцев назад эксперты компании RedLock Cloud Security Intelligence обнаружили, что многие предприятия не закрывают доступ к консоли Kubernetes. Данная консоль используется для централизованного управления приложениями в облачных сервисах, таких как Amazon...
Пять главных анонсов бизнес-приложений Microsoft с конференции в Амстердаме На конференции Business Forward в Амстердаме Microsoft анонсировала ряд бизнес-приложений, которые помогут компаниям во всем мире использовать прогрессивные технологии и искусственный интеллект для работы с бизнес-данными. Среди представленных продуктов — приложения и платфо...
MWC 2018: Ericsson поможет Far EasTone развивать IoT-услуги Корпоративные клиенты Far EasTone получат все преимущества, которые дает использование технологии NB-IoT на мировом рынке, а иностранные компании смогут выйти на IoT-рынок Тайваня.
12NEWS.RU :: Блоги :: Пользователи Bentley Systems используют машинное обучение По информации 12NEWS (Ведущее ИТ-издание по корпоративным системам и приложениям — www.12news.ru), Bentley Systems объявила о доступе к новым технологиям в области обработки данных и машинного обучения на основе Microsoft Azure для AssetWise CONNECT Edition Найти: ERP, CRM,...
Объем рынка компьютерного зрения приближается к$2 млрд Такие данные в начале марта 2018 года опубликовала исследовательская компания Tractica.Производители по-новому используют камеры в мобильных устройствах, потребительских, коммерческих и промышленных продуктах, а алгоритмы искусственного интеллекта для компьютерного зрения бы...
Мобильное приложение My BP Lab поможет измерить давление и уровень стресса Компания Samsung Electronics и Калифорнийский университет в Сан-Франциско (UCSF) объявили о разработке мобильного приложения My BP Lab, которое поможет владельцам флагманских смартфонов Galaxy следить за состоянием здоровья. Программа My BP Lab использует в работе и...
Vivo Apex: безрамочник из будущего Крупный китайский производитель смартфонов Vivo в рамках выставки MWC 2018 в Барселоне показал концепт смартфона Apex, 98% фронтальной панели которого занимает дисплей. Однако ключевыми особенностями смартфона являются технологии, которые использовал производитель, чтобы ост...
Презентация Samsung Galaxy S9 будет проведена с использованием технологии дополненной реальности Источники сообщили о том, что в процессе презентации смартфона Samsung Electronics будет использоваться технология дополненной реальности. В ходе мероприятия посетители смогут рассмотреть Samsung Galaxy S9 буквально во всех деталях при помощи нового приложения для с...
VRTech предлагает обучать промышленников в виртуальной реальности В рамках презентации было проведено рабочее совещание с целью создания пилотных проектов обучающих тренажеров и аттестации сотрудников Российских промышленных предприятий.
Intel выложил в open source разговорную систему Стивена Хокинга Intel выложил в open source платформу Assistive Context-Aware Toolkit, которая помогает людям с ограниченными возможностями общаться с внешним миром.
Organoid 1.1.36 Organoid — ваша персональная база данных и интернет органайзер. Просто нажмите «Поделиться» в веб-браузере своего устройства и сохраняйте ссылки на YouTube видео, Instagram фото и видео, гифки с Pinterest, DeviantArt, Giphy, картинки с других сайтов, товары в Интернет-ма...
MWC 2018: Ericsson будет использовать AI на уровне всей компании Machine Intelligence Ericsson представляет новый корпоративный подход, основанный на использовании технологий искусственного интеллекта на уровне всей компании и в процессе работы с клиентами.
В Еврокомиссии проведут круглый стол на тему криптовалют Вице-председатель Европейской Комиссии и Европейский комиссар по вопросам евро и социального диалога Валдис Домбровскис проведет круглый стол с представителями государственного и корпоративного секторов на тему влияния криптовалют на деятельность центробанков. Об этом говори...
Microsoft добавит в корпоративную платформу Teams автоперевод и поддержку Surface Hub Корпоративной платформе Microsoft Teams исполнился год, в честь чего редмондская компания анонсировала для неё ряд улучшений. Наиболее важные из них — совместимость с корпоративными телефонными системами и возможность звонить на обычные телефоны, автоматически...
Apple и IBM превратят iPhone в суперкомпьютер Apple и IBM объявили о намерении развивать технологии машинного обучения в рамках совместного проекта по совершенствованию фреймворка Core ML. Об этом во вторник, 20 марта, сообщает TechCrunch. Объединение усилий поможет компаниям более основательно продвинуться в развитии...
В Google Play появилась возможность запускать игры, не устанавливая их На конференции Game Developers Conference 2018 в Сан-Франциско Google анонсировала Google Play Instant — обновлённую систему приложений для Android, которая позволяет запускать их без установки на устройство. Работу технологии можно опробовать уже сейчас на Cl...
Samsung представила коммерческие решения 5G Samsung Electronics покажет свои сетевые коммерческие решения 5G на MWC 2018, открывая новые возможности для будущего мобильной связи. Демонстрации, которые планируется провести во время мероприятия на стенде Samsung Networks, будут использовать решения 5G, чтобы продемонстр...
Oracle ожидает искусственный интеллект в 90% корпоративных приложений В Oracle считают, что через два года больше половины данных компаний будут управляться автономно, используя алгоритмы искусственного интеллекта.
Израиль просит Россию помочь урегулировать конфликт на границе с Сирией Израиль отправил в Россию официальное сообщение, в котором попросил помощи в урегулировании конфликта на границе с Сирией. Ситуация обострилась после того, как там сбили иранский беспилотный воздушный корабль. В ответ войска САР обстреляли израильский истребитель, потерпе...
Почта Японии протестирует беспилотный автомобиль для доставки корреспонденции Информационное агентство Киодо сообщает, что государственная почтовая служба Японии намерена испытать качество беспилотных автомобилей, используя один из них для перевозки корреспонденции от одного почтового отделения к другому. «Это вполне под силу современным авто...
12NEWS.RU :: Блоги :: Selectel запустил электронную площадку для закупок на базе B2B-Center По информации 12NEWS (Ведущее ИТ-издание по корпоративным системам и приложениям — www.12news.ru), крупнейший российский IaaS-провайдер Selectel перевел закупки в электронную форму и запустил корпоративную торговую площадку на базе B2B-Center. Найти: ERP, CRM, MES, рекламна...
НАСА сможет определить, какие ледники могут наводнить прибрежные города Таяние ледников — плохая вещь. Они поднимают уровни воды в океане и могут сильно затопить прибрежные районы. НАСА в этом стихийном бедствии может помочь. Недавно ученые разработали метод, который определяет, какие ледники представляют угрозу для конкретной области. Эт...
Рекультивация полигона в Торбеево получила обсуждение на совещании Мособлдумы в Люберцах Во время совещания комитета Мособлдумы по экологии и природоведению были затронуты вопросы рекультивации (а она состоится в 2021-м году) ныне функционирующего в Торбеево полигона ТБО. Мероприятие приняли на своей площадке подмосковные Люберцы. Об этом рассказывает Федерально...
В iOS 11.3 и tvOS 11.3 появилась поддержка AirPlay 2 Разработчик обнаружил в первой бета-версии iOS 11.3 и tvOS 11.3 функции, свидетельствующие о скором появлении технологии AirPlay 2. В частности, речь идет о поддержке мультирума на Apple TV при проигрывании музыки с iPhone. Если установить iOS 11.3 на iPhone или iPad, а...
Новейшие достижения в сферах коммерциализации решений 5G представила ZTE Компания ZTE Corporation (0763.HK / 000063.SZ), крупный международный поставщик телекоммуникационных решений, а также корпоративных и потребительских технологий для мобильного Интернета, в ходе Всемирного мобильного конгресса-2018 в Барселоне, представила свои новейшие дости...
Видео дня: самолёт Stratolaunch вывели на «пробежку» Stratolaunch — самолёт с самым большим размахом крыльев. В данном случае он достигает 117,3 м при длине 72,5 м. Самолёт для является пассажирским или грузовым. Он предназначен для запуска небольших ракет, которые будут выводить на орбиту различные грузы. Такой вариант з...
Жители Сан-Франциско смогут использовать приложение Uber для аренды велосипедов Разработчики Uber Technology Inc. анонсировали расширение функциональности собственного мобильного приложения за счет добавления возможности аренды велосипедов.
Еженедельное селекторное совещание Исаака Калины транслирует в прямом эфире Московский образовательный телеканал Как сообщает официальный сайт мэра Москвы, Московский образовательный телеканал, работающий с 2015 года, представил новую сетку вещания с актуальными передачами. Единственный телеканал о столичном образовании в сети интернет представляет новые программы. Ежедневно в прямом ...
Бесплатное приложение Otter на базе искусственного интеллекта преобразует речь в напечатанный текст Новый бесплатный сервис Otter наверняка заинтересует тех, кому по роду своей работы приходится записывать разговорную речь и затем преобразовывать ее в печатный текст. Он был представлен на Mobile World Congress 2018.
Двигатель цифровой трансформации — сотрудники Компания VMware представила ежегодный отчет о состоянии технологий для создания цифровых рабочих пространств и их влиянии на бизнес. Результаты проведенного исследования говорят о том, что сотрудники в России, наделенные возможностями, — например, удаленным доступом к предпо...
Экс-менеджер LinkedIn Эмили Чои заняла должность вице-президента Coinbase Крупнейшая биткоин-компания Coinbase объявила о назначении на должность вице-президента по корпоративному и деловому развитию Эмили Чои, ранее более восьми лет работавшую на аналогичной должности в LinkedIn. Об этом сообщается в блоге компании. По словам представителей комп...