Учитывая любой список XS
, где XS
может содержать другие списки или любые значения не списка, мы хотим извлечь все значения в XS.
. Например:
сплит ([1, [3], [[6, 7], [[[[]], 8]]]) => [1, 3, 6, 7, 8]
сплит ([{A: 3}, 1, [[''], 2]]) => [{A: 3}, 1, '', 2]
Когда мы хотим вывести рекурсивное решение, мы должны избегать мышления рекурсивно. Никогда не проследите свой код в рекурсивные звонки! Правильный подход состоит в том, чтобы предположить, что функция, которую вы хотите определить, уже работает над меньшей структурой ввода, что в этом случае меньшая структура, очевидно, хвост XS
, то есть Xs.slice (1)
. Это предположение называется прыжок веры
Отказ
Так что теперь, если Flatten (Xs.slice (1))
будет работать правильно, как мы могли бы использовать это, чтобы построить полный правильный ответ сплит (х)
? Теперь я не хватает XS [0]
Отказ XS [0]
может быть либо элемент без списка или другой список.
Если XS [0]
Это элемент не списка, мы просто добавляем XS [0]
на первое место Flatten (Xs.slice (1))
Тогда мы сделаем!
Если XS [0]
другой список, мы берем прыжок веры
и рекурсивно звонить сглаживать (xs [0])
Отказ Тогда мы можем объединить сплит (XS [0])
к Flatten (Xs.slice (1))
.
function flatten(xs){ if(Array.isArray(xs[0])) return [...flatten(xs[0]), ...flatten(xs.slice(1))]; else return [xs[0], ...flatten(xs.slice(1))]; }
Теперь, что мы скучаем, это базовый случай. Самый маленький список, который мы можем сгладить, должно быть []
и ответ, очевидно, []
.
Так Последний код
function flatten(xs){ if(xs.length === 0) return []; if(Array.isArray(xs[0])) return [...flatten(xs[0]), ...flatten(xs.slice(1))]; else return [xs[0], ...flatten(xs.slice(1))]; }
Оригинал: “https://dev.to/ycmjason/how-to-elegantly-flatten-a-list-61c”