Автор оригинала: FreeCodeCamp Community Member.
У меня были проблемы с пониманием Уменьшить ()
И рекурсия в JavaScript, поэтому я написал эту статью, чтобы объяснить ее себе (эй, посмотри, рекурсию!). Эти понятия разделяют некоторые сходства с созданием пирогов Apple. Я надеюсь, что вы найдете свои примеры как полезными, так и вкусными.
Учитывая массив с вложенными массивами:
var arr = [1, [2], [3, [[4]]]]
Мы хотим произвести это:
var flat = [1, 2, 3, 4]
Использование для циклов и если утверждения
Если мы знаем максимальное количество вложенных массивов, мы встретимся (есть 4 в этом примере), мы можем использовать для
петли для итерации через каждый элемент массива, то Если
утверждения, чтобы проверить, будет ли этот предмет сам по себе массив, и так далее …
function flatten() { var flat = []; for (var i=0; i
… который работает, но оба трудно читать и сложнее понять. Кроме того, он работает только, если вы знаете, сколько вложенных массивов обрабатывать, и вы можете себе представить, чтобы отладить этот беспорядок?! (Джи, я думаю, что есть дополнительные я где-нибудь.)
Используя уменьшение
JavaScript имеет пару методов, которые мы можем использовать, чтобы сделать наш код более лаконичным и проще следовать. Один из них – Уменьшить ()
И это выглядит так:
var flat = arr.reduce(function(done,curr){ return done.concat(curr); }, []); // [ 1, 2, 3, [ [ 4 ] ] ]
Это намного меньше кода, но мы не позаботились о некоторых из вложенных массивов. Давайте сначала прогуляемся через Уменьшить ()
Вместе и проверьте, что это делает, чтобы увидеть, как мы исправим это.
Это не так сложно, как кажется. Давайте подумаем о Уменьшить ()
Как неработающий разработчик (AI взял все Джобсы Dev) с пустой корзиной. Мы назовем его Адам. Основная функция Адама теперь, чтобы принять яблоки из кучи, сияют их, и положите их в корзину. Эта корзина блестящих яблок суждена стать вкусными яблочными пирогами. Это очень важная работа.
В нашем приведенном выше примере куча яблок – наша массив, arr
Отказ Наша корзина сделано
аккумулятор. Начальное значение сделано
это пустой массив, который мы видим как []
В конце нашей функции снижения. Apple, что Адам в настоящее время сияет, вы догадались, это Curry
Отказ Как только ADAM обрабатывает текущее яблоко, он помещает его в корзину ( .Concat ()
). Когда в куче нет больше яблок, он возвращает корзину отполированных яблоков к нам, а затем идет домой к его кошке.
Использование уменьшения рекурсивно для решения вложенных массивов
Так что все хорошо и хорошо, и теперь у нас есть корзина отполированных яблок. Но у нас еще есть несколько вложенных массивов, чтобы иметь дело с. Возвращаясь к нашей аналогии, скажем, что некоторые яблоки в куче находятся в коробках. В каждом поле может быть больше яблок, а также/или больше коробок, содержащих меньшие, стрижки яблоки.
Вот что мы хотим, чтобы наша функция обработки Apple/Adam сделать:
- Если куча яблок – это куча яблок, возьмите яблоко из кучи.
- Если яблоко – яблоко, польский его, положите его в корзину.
- Если яблоко – это коробка, откройте коробку. Если коробка содержит яблоко, перейдите к шагу 2.
- Если коробка содержит другое поле, откройте эту коробку и перейдите к шагу 3.
- Когда куча больше не является, дайте нам корзину блестящих яблок.
- Если куча яблок не куча яблок, отдайте еще, что все это.
Рекурсивная функция уменьшения, которая выполняет это:
function flatten(arr) { if (Array.isArray(arr)) { return arr.reduce(function(done,curr){ return done.concat(flatten(curr)); }, []); } else { return arr; } } // [ 1, 2, 3, 4 ]
Нести со мной, и я объясню.
Если вы изучите наш код выше, вы увидите, что сплит ()
появляется дважды. В первый раз, когда он появляется, он говорит Адаму, что делать с кучей яблок. Во второй раз он говорит ему, что делать с тем, что он в настоящее время держит, предоставляя инструкции в том случае, это яблоко, а в случае это не яблоко. Обратите внимание, что эти инструкции являются Повторите оригинальные инструкции, которые мы начали с – И это рекурсия.
Мы нарушим его в строке по ясности:
Функция flatten (arr) {
– Мы называем нашу общую функцию и укажете, что она возьмет аргумент,arr
ОтказЕсли (Array.isarray (ARR)) {
– Мы изучаем предоставленный «Arrgument» (я знаю, я очень забавный), чтобы определить, является ли это массивом.return ref.recuce (Функция (сделано, curr) {
– если предыдущая строка верна, и аргумент – это массив, мы хотим уменьшить его. Это наш рекурсивный случай. Мы применяем следующую функцию для каждого массива. пункт…repeet.Concat (flatten (curr));
– появляется неожиданный поворот сюжета! Функция, которую мы хотим подать заявку, – это сама функция, в которой мы находимся. Глонокуально: возьми его сверху.}, []);
– Мы говорим нашему снижению функции, чтобы начать с пустого аккумулятора (Готово
), и заверните его.} else {
– Это решает наше заявление в линейке 2. Если предоставленный аргумент не массив …вернуть ARM;
– Верните все, чтоarr
является. (Надеюсь, милое яблоко.) Это наш базовый случай, который нарушает нас из рекурсии.}
– Завершите заявление о остальном.}
– Завершить общую функцию.
И мы закончили! Мы отправились от нашей 24 строки, вложенный в глубине 4 слоев для
Раствор петлей до гораздо более лаконичной, 9 линий рекурсивное уменьшение раствора. Сначала уменьшите и рекурсию могут показаться немного непроницаемыми, но они являются ценными инструментами, которые сэкономит вам много будущих усилий, когда вы почувствуете их.
И не беспокойтесь о Адаме, нашей неработающей разработчике. Он получил столько прессов после того, как был представлен в этой статье, что он открыл свой собственный AI-управляемый Apple Pier Factory. Он очень счастлив.
Спасибо за прочтение! Вы можете найти больше статей, объясняющих концепции кодирования с едой в моем блоге .