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

Как элегантно сгладить список

Проблема дана любого списка XS, где XS может содержать другие списки или любые значения без списка, … с меткой JavaScript, Recursion, Functional.

Учитывая любой список XS , где XS может содержать другие списки или любые значения не списка, мы хотим извлечь все значения в XS. . Например:

  1. сплит ([1, [3], [[6, 7], [[[[]], 8]]]) => [1, 3, 6, 7, 8]
  2. сплит ([{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”