#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[];
}
Я не знаю, была ли это опечатка с вашей стороны, но решение, вероятно, должно работать в любом случае.