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

Как рекурсивно извлечь данные массива объектов?

Здравствуйте! Имею массив evolves_to из Pokemon API вида :
61efdfcb4daf0674633106.png

Мне необходимо вытянуть объект species из каждого evolves_to. Как можно рекурсивно вытащить из такого вложенного объекта?

Я пробовал написать это, но что то затупил на том как вернуть данные
export const getEvoChain = (chainArray: any): any => {
    console.log(chainArray)
    chainArray && chainArray.map( 
        (element: any) => {
            console.log(element.species)
            if(element.hasOwnProperty('evolves_to')){
                getEvoChain(element.evolves_to)
                
            }  
        }
    )
    
}


Заранее благодарю
  • Вопрос задан
  • 104 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 1
0xD34F
@0xD34F
Рекурсия возможна:

const getFromTree = (tree, childrenKey, getter = n => n) =>
  Array.isArray(tree)
    ? tree.flatMap(n => [
        getter(n),
        ...getFromTree(n[childrenKey], childrenKey, getter),
      ])
    : [];

// или

function* flatTree(tree, childrenKey) {
  if (
    tree instanceof Object &&
    tree[Symbol.iterator] instanceof Function
  ) {
    for (const n of tree) {
      yield n;
      yield* getFromTree(n[childrenKey], childrenKey);
    }
  }
}

Но не обязательна:

const getFromTree = function(tree, childrenKey, getter = n => n) {
  const result = [];

  for (const stack = this(tree); stack.length;) {
    const n = stack.pop();
    result.push(getter(n));
    stack.push(...this(n[childrenKey]));
  }

  return result;
}.bind(x => x instanceof Array ? [...x].reverse() : []);

// или

const flatTree = function*(tree, childrenKey) {
  const stack = [];

  for (let [ i, arr ] = this(tree); ++i < arr.length || stack.length;) {
    if (i === arr.length) {
      [ i, arr ] = stack.pop();
    } else {
      yield arr[i];
      stack.push([ i, arr ]);
      [ i, arr ] = this(arr[i][childrenKey]);
    }
  }
}.bind(x => [ -1, x?.constructor === Array ? x : [] ]);

Извлекаем:

// если использовать обычную функцию
const result = getFromTree(tree, 'evolves_to', n => n.species);
// или, генератор
const result = Array.from(flatTree(tree, 'evolves_to'), n => n.species);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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