Рубрики
Без рубрики

Понимание Array.Prototype.recuce () и рекурсия с использованием яблочного пирога

У меня проблемы с пониманием уменьшения () и рекурсии в JavaScript, поэтому я написал эту статью, чтобы объяснить ее себе (эй, посмотри, рекурсию!). Эти понятия разделяют некоторые сходства с созданием пирогов Apple. Я надеюсь, что вы найдете свои примеры как полезными, так и вкусными. Учитывая массив с вложенными массивами: var arr

Автор оригинала: 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 сделать:

  1. Если куча яблок – это куча яблок, возьмите яблоко из кучи.
  2. Если яблоко – яблоко, польский его, положите его в корзину.
  3. Если яблоко – это коробка, откройте коробку. Если коробка содержит яблоко, перейдите к шагу 2.
  4. Если коробка содержит другое поле, откройте эту коробку и перейдите к шагу 3.
  5. Когда куча больше не является, дайте нам корзину блестящих яблок.
  6. Если куча яблок не куча яблок, отдайте еще, что все это.

Рекурсивная функция уменьшения, которая выполняет это:

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 ]

Нести со мной, и я объясню.

Если вы изучите наш код выше, вы увидите, что сплит () появляется дважды. В первый раз, когда он появляется, он говорит Адаму, что делать с кучей яблок. Во второй раз он говорит ему, что делать с тем, что он в настоящее время держит, предоставляя инструкции в том случае, это яблоко, а в случае это не яблоко. Обратите внимание, что эти инструкции являются Повторите оригинальные инструкции, которые мы начали с – И это рекурсия.

Мы нарушим его в строке по ясности:

  1. Функция flatten (arr) { – Мы называем нашу общую функцию и укажете, что она возьмет аргумент, arr Отказ
  2. Если (Array.isarray (ARR)) { – Мы изучаем предоставленный «Arrgument» (я знаю, я очень забавный), чтобы определить, является ли это массивом.
  3. return ref.recuce (Функция (сделано, curr) { – если предыдущая строка верна, и аргумент – это массив, мы хотим уменьшить его. Это наш рекурсивный случай. Мы применяем следующую функцию для каждого массива. пункт…
  4. repeet.Concat (flatten (curr)); – появляется неожиданный поворот сюжета! Функция, которую мы хотим подать заявку, – это сама функция, в которой мы находимся. Глонокуально: возьми его сверху.
  5. }, []); – Мы говорим нашему снижению функции, чтобы начать с пустого аккумулятора ( Готово ), и заверните его.
  6. } else { – Это решает наше заявление в линейке 2. Если предоставленный аргумент не массив …
  7. вернуть ARM; – Верните все, что arr является. (Надеюсь, милое яблоко.) Это наш базовый случай, который нарушает нас из рекурсии.
  8. } – Завершите заявление о остальном.
  9. } – Завершить общую функцию.

И мы закончили! Мы отправились от нашей 24 строки, вложенный в глубине 4 слоев для Раствор петлей до гораздо более лаконичной, 9 линий рекурсивное уменьшение раствора. Сначала уменьшите и рекурсию могут показаться немного непроницаемыми, но они являются ценными инструментами, которые сэкономит вам много будущих усилий, когда вы почувствуете их.

И не беспокойтесь о Адаме, нашей неработающей разработчике. Он получил столько прессов после того, как был представлен в этой статье, что он открыл свой собственный AI-управляемый Apple Pier Factory. Он очень счастлив.

Спасибо за прочтение! Вы можете найти больше статей, объясняющих концепции кодирования с едой в моем блоге .