Задать вопрос
@minaev007

Как вывести все элементы списка (в том числе вложенные)?

var all = [];
function one(numbers) {
    for (i=0; i<numbers.length; i++) {
        if (numbers[i].length) {
            one(numbers[i]);
        } else {
            all.push(numbers[i]);
        }
    }
    return all;
}
var numbers = [1,[6,7],2,3,4,5];
console.log(one(numbers)); // [1, 6, 7, 3, 4, 5]
// нужно // [1, 6, 7, 2, 3, 4, 5]


почему после возвращения из рекурсивного вызова i=3 а не 2? ..
  • Вопрос задан
  • 126 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
почему после возвращения из рекурсивного вызова i=3 а не 2?

Не выдумывайте, там 2. Хотя должно быть 1.

То, что функция работает не так, как вы ожидаете - это потому что переменная i является глобальной. А то, что вообще работает - потому что строгий режим не включался. Погуглите, что происходит при присваивании значения необъявленной переменной.

Массив, в который складываете значения, тоже зачем-то глобальный. Если воспользоваться вашей функцией несколько раз, то в нём окажутся результаты всех вызовов. Так и задумано или перед каждым новым вызовом собираетесь его вручную очищать?

if (numbers[i].length) {

Условие рекурсивного вызова кривое - что, если какой-то из вложенных массивов окажется пустым? Он тогда будет рассматриваться как значение, которое должно быть помещено в массив с результатами.

Исправляем (и переписываем).
function flat(arr) {
  const result = [];

  for (const n of arr) {
    if (n instanceof Array) {
      result.push(...flat(n));
    } else {
      result.push(n);
    }
  }

  return result;
}

// или

const flat = arr =>
  Array.prototype.concat.apply(
    [],
    arr.map(n => Array.isArray(n) ? flat(n) : n)
  );
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы