[Из песочницы] Понимание Array.prototype.reduce() и рекурсии на примере яблочного пирога

Комментарии (3)

  • 1 июня 2017 в 18:17 (комментарий был изменён)

    0

    С одной стороны, очень хочется оставить едкий комментарий типа «когда будет статья про понимание Array.length?». С другой, я действительно нередко наблюдал, как начинающие погромисты тупят при знакомстве с reduce. В следующий раз попробую подвергнуть такого человека чтению этой статьи.
  • 1 июня 2017 в 18:37

    0

    Ваш пример — отличный пример подмены понятий. Никаких сложностей переписать for на такую-же рекурсивную форму, как ваш reduce нет, и, соответственно, нет перечисленных проблем. Да еще и намеренно написан ужасный нечитаемый код. Нда.


    И опять же, в первом случае у вас не создается сотен промежуточных массивов, что потребление памяти, что время выполнения меньше, даже если переписать на рекурсию (передавая var flat = [] как параметр).

  • 1 июня 2017 в 18:47

    0

    Я как-то против вашего решения.


    Если начал использовать функциональный подход, то становится трудно остановиться, а вы решились на reduce и тут же остановились на грязной функции


    flatten у вас делает слишком много работы — она и самим array занимается, и лезет в его вещи и там шурует и объявляет ещё функции внутри и создает кучу всего.


    Предлагаю такую функцию:


    var flattenReduceArray = (result, item) => Array.isArray(item) ? item.reduce(flattenReduceArray, result) : [...result, item]

    Читабельный ES5 вариант:


    function flattenReduceArrayES5 (result, item) {
      if (Array.isArray(item)) {
        return item.reduce(flattenReduceArrayES5, result)
      } else {
        result.push(item);
        return result;
      }
    }

    Во-первых, не создается никаких функций и промежуточных массивов — все пишется в один массив


    Во-вторых, функция занимается исключительно элементами массива и ничем больше.

© Habrahabr.ru