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

Как из вложенных массивов выбрать нужные элементы без рекурсии?

Есть массив объектов:
[
    {
        "id": 1,
        "name": "Бумага",
        "children" :[
            {
                "id": 2,
                "name": "Бумага офисная",
                "children" :[
                    {
                        "id": 3,
                        "name": "Бумага для принтера"
                    },
                    {
                        "id": 4,
                        "name": "Бумага для цветная"
                    }
                ]

            }
        ]
    },
    {
        "id": 5,
        "name": "Товары для офиса",
        "children" :[
            {
                "id": 6,
                "name": "Оборудование",
                "children" :[
                    {
                        "id": 7,
                        "name": "Для досок"
                    },
                    {
                        "id": 8,
                        "name": "Бэйджики"
                    }
                ]

            }
        ]
    },
    {
        "id": 9,
        "name": "Товары для школы",
        "children" :[
            {
                "id": 10,
                "name": "Подарки",
                "children" :[
                    {
                        "id": 11,
                        "name": "Конфеты"
                    },
                    {
                        "id": 12,
                        "name": "Игрушки"
                    }
                ]

            }
        ]
    }
]

Нужно выбрать элементы без children, т.е.
[
		{
                        "id": 3,
                        "name": "Бумага для принтера"
                    },
                    {
                        "id": 4,
                        "name": "Бумага для цветная"
                    },
                                {
                        "id": 7,
                        "name": "Для досок"
                    },
                    {
                        "id": 8,
                        "name": "Бэйджики"
                    },
		{
                        "id": 11,
                        "name": "Конфеты"
                    },
                    {
                        "id": 12,
                        "name": "Игрушки"
                    }
]


Можно это сделать без рекурсии?
  • Вопрос задан
  • 166 просмотров
Подписаться 1 Простой 6 комментариев
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
function getLeaves(tree) {
  const result = [];

  for (const stack = [...tree]; stack.length;) {
    const n = stack.pop();
    if (Array.isArray(n.children) && n.children.length) {
      stack.push(...n.children);
    } else {
      result.push(n);
    }
  }

  return result.reverse();
}

const leaves = getLeaves(tree);

или

const getFromTree = function*(tree, test) {
  const stack = [];

  for (let [ i, arr ] = this(tree); ++i < arr.length || stack.length;) {
    if (i === arr.length) {
      [ i, arr ] = stack.pop();
    } else {
      if (test(arr[i])) {
        yield arr[i];
      }

      stack.push([ i, arr ]);
      [ i, arr ] = this(arr[i].children);
    }
  }
}.bind(x => [ -1, x instanceof Array ? x : [] ]);

const leaves = [...getFromTree(tree, n => !n.children?.length)];
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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