[Из песочницы] Понимание 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; } }
Во-первых, не создается никаких функций и промежуточных массивов — все пишется в один массив
Во-вторых, функция занимается исключительно элементами массива и ничем больше.