如何构建这个函数来获取一个树对象数组并将它们连接到一个树目标中



我正在尝试编写一个名为buildTree((的函数,该函数以以下数据结构为输入,在每个元素上循环以输出特定格式的树:这是我的数据结构的一个例子:

let array =  [
{
levelOne: [
{
id: 'a',
rowData: {}
}
]
},
{
levelOne: [
{
id: 'b',
children: {
levelTwo: [
{
id: 'c',
rowData: {}
}
]
}
}
]
},
{
levelOne: [
{
id: 'b',
children: {
levelTwo: [
{
id: 'd',
rowData: {}
}
]
}
}
]
}
]

如果我们将数组传递给buildTree((

let result = this.buildTree(array);

结果应该包含以下树:

{
levelOne: [
{
id: 'a',
rowData: {}
},
{
id: 'b',
children: {
levelTwo: [
{
id: 'c',
rowData: {}
},
{
id: 'd',
rowData: {}
}
//two elements in this array since they share the id             
]
}
}
]
}

另一个例子是:

let array2 = [
{
levelOne: [
{
id: 'a',
rowData: {}
}
]
},
{
levelOne: [
{
id: 'a',
children: {
levelTwo: [
{
id: 'b',
rowData: {}
}
]
}
}
]
},
{
levelOne: [
{
id: 'a',
children: {
levelTwo: [
{
id: 'b',
children: {
levelThree: [
{
id: 'c',
rowData: {}
}
]
}
}
]
}
}
]
},
{
levelOne: [
{
id: 'a',
children: {
levelTwo: [
{
id: 'b',
children: {
levelThree: [
{
id: 'd',
rowData: {}
}
]
}
}
]
}
}
]
}
];
let result2 = this.buildTree(array2)

结果2应该保持:

{
levelOne: [
{
id: 'a',
rowData: {},
children: {
levelTwo: [
{
id: 'b',
rowData: {},
children: {
levelThree: [
{
id: 'c',
rowData: {}
},
{
id: 'd',
rowData: {}
}
]
}
}
]
}
}
]
}

请记住,如果数组中的两个元素具有相同的id,那么它们在结果中应该属于其键的相同子项,如示例所示。

我写了一个助手函数来获取特定级别的元素,名为getElementByLevel((:

getElementByLevel(tree: any, level: number , count = 0){
// debugger;
if(tree){
let key = Object.keys(tree)[0]
let element = tree[key][0];
if(count<level){
count=count+1
return this.getElementByLevel(element.children,level , count)
}
else {
return element;
}
}
else {
return null;
}
}

这是我无法操作的不完全buildTree((函数:

buildTree(mainArray: any[]){
let myTree = {};
mainArray.forEach((item , index) => {
if(index == 0){
myTree = {...item};
console.log(myTree);
}
else
{
debugger;
let myElement = this.getElementByLevel(myTree, 0);
let elementToAdd = this.getElementByLevel(mainArray[1],0 )
myElement = {...myElement, ...elementToAdd}
console.log(myElement);
myTree = myElement;
}

})

}

有关输入数据结构的更多信息:

-rowData始终位于树的最后一级。

-"levelOne"、"levelTwo"、"levelThree"等的数组是包含一个对象(仅在输入中(的单体

-密钥("levelOne"、"levelTwo"、"levelThree"等(是动态密钥,需要保留在数据结构中,如示例所示。

关于输出树的更多信息:

-具有相同id和相同父关键字(例如levelOne(的元素必须将其子元素作为兄弟姐妹。一个例子是-array[1].levelOne[0]和-array[2].levelOne[0]-导致-result-中的兄弟子女

任何关于如何构建buildTree((函数的想法都将受到的赞赏

您必须使用递归首先构建一个以id值为键的树(以便在同一id多次出现的情况下快速查找(。然后在第二阶段,你可以变换该结构,使其具有";级别XXX";值作为数组——不适合id:快速查找

function buildTree(array) {
function mergeByKeys(levelItem, result) {
for (let levelKey in levelItem) {
let idItems = result[levelKey] = result[levelKey] || {};
for (let {id, children, rowData} of levelItem[levelKey]) {
let item = idItems[id] = idItems[id] || {id};
if (children) item.children = mergeByKeys(children, item.children || {});
if (rowData) item.rowData = rowData;
}
}
return result;
}
function levelsToArrays(levelItem) {
for (let levelKey in levelItem) {
for (let { children } of (levelItem[levelKey] = Object.values(levelItem[levelKey]))) {
if (children) levelsToArrays(children);
}
}
}
let result = {};
for (let levelItem of array) mergeByKeys(levelItem, result);
levelsToArrays(result);
return result;
}
// Example 2:
let array2 = [{levelOne: [{id: 'a',rowData: {}}]},{levelOne: [{id: 'a',children: {levelTwo: [{id: 'b',rowData: {}}]}}]},{levelOne: [{id: 'a',children: {levelTwo: [{id: 'b',children: {levelThree: [{id: 'c',rowData: {}}]}}]}}]},{levelOne: [{id: 'a',children: {levelTwo: [{id: 'b',children: {levelThree: [{id: 'd',rowData: {}}]}}]}}]}];
let result2 = buildTree(array2)
console.log(result2);

这是您要搜索的正确结构吗?

输入:

let structure = [
{
one: {
id: 'ISBWIS',
rowData: 346234,
children: [
{
two: {
id: 'UUEJSW',
rowData: 958793
}
}
]
}
},
{
one: {
id: 'KSDIWG',
rowData: 857262,
children: [
{
two: {
id: 'XJSHWQ',
rowData: 855582
}
}
]
}
},
{
one: {
id: 'ISBWIS',
children: [
{
two: {
id: 'KNWEJD',
rowData: 181132
}
}
]
}
},
{
one: {
id: 'ISBWIS',
children: [
{
two: {
id: 'KNWEJD',
children: [
{
three: {
id: 'JEISYS',
rowData: 454933
}
}
]
}
}
]
}
}
];

输出:

{
"one": [
{
"id": "ISBWIS",
"rowData": 346234,
"children": {
"two": [
{
"id": "UUEJSW",
"rowData": 958793
},
{
"id": "KNWEJD",
"rowData": 181132,
"children": {
"three": [
{
"id": "JEISYS",
"rowData": 454933
}
]
}
}
]
}
},
{
"id": "KSDIWG",
"rowData": 857262,
"children": {
"two": [
{
"id": "XJSHWQ",
"rowData": 855582
}
]
}
}
]
}

最新更新