Как извлечь значение из дочерних элементов в массиве

#javascript #arrays #typescript

#javascript #массивы #typescript

Вопрос:

У меня есть коллекция, основанная на интерфейсе ниже

 interface ITurbine {
  id: string;
  name: string;
  turbine: ITurbine[];
}
  

коллекция может иметь очень глубокие значения с одинаковой структурой.

Как я могу извлечь все дочерние элементы в один список с одним уровнем

псевдо-пример турбины

 [
{id:1, name:test1, turbine:null},
{id:2, name:test2, turbine:[
                            id:3, name:test3, turbine: {id:4, name:test4, turbine:null}    
                            id:5, name:test5, turbine: {id:6, name:test6, turbine:null}   
                    ]},
]
  

ожидаемый результат — извлечь все турбины в один массив

 [
{id:1, name:test1},
{id:2, name:test2},
..
{id:6, name:test6}
]


const getInLineTurbineArray = (turbines: ITurbine[]): ITurbine[] => {
  let inlineTurbines: ITurbine[] = [];
  inlineTurbines.forEach((turbine) => {
    var test = extractTurbines(turbine);
    inlineTurbines.push(test)
  });
  return inlineTurbines;
};

const extractTurbines = (turbines: ITurbine) => {
  if (turbines.turbine) {
    turbines.turbine.forEach((child) => {
      return extractTurbines(child);
    });
  } else {
    return turbines;
  }
};
  

Комментарии:

1. Итак, первый указатель — это то, что forEach не возвращает результатов. Вы захотите использовать map для возврата всех собранных результатов. И поскольку вы рекурсивно спускаетесь по дереву, вы, скорее всего, захотите сгладить результаты по мере их сбора.

Ответ №1:

То, что вы пытаетесь выполнить, называется «выравниванием» и, в частности, выравниванием древовидной структуры, где узел (турбина) может иметь 0 .. n листьев (другие турбины). Вы можете попробовать использовать рекурсию для работы с подобными структурами.

 const tree = [
  {id:1, name:"test1", turbine:null},
  {id:2, name:"test2", turbine:[
      {id:3, name:"test3", turbine: {id:4, name:"test4", turbine:null}},
      {id:5, name:"test5", turbine: {id:6, name:"test6", turbine:null}}   
    ]
  },
]

function flattenTree(tree) {
  let result = [];

  if(Array.isArray(tree)) {
    for(const node of tree) {
      result.push(
        {id: node.id, name: node.name}
      );

      if(node.turbine) {
        result = result.concat(flattenTree(node.turbine));
      }
    }
  } else {
    result.push({id: tree.id, name: tree.name})
  }

  return resu<
}

console.log(flattenTree(tree))
  

пытаясь найти решение, я также увидел, что приведенный вами пример объекта больше похож на этот интерфейс:

 interface ITurbine {
  name: string;
  id: number;
  turbine?: ITurbine | ITurbine[];
}
  

Я не знаю, была ли это опечатка с вашей стороны, но решение, вероятно, должно работать в любом случае.