2017-04-07 6 views
0

Ich habe ein Problem beim Erstellen eines Baumes aus einem flachen Array. Ich baue eine Kategorie -> Unterkategorie Baum, in dem der Elternteil Unterkategorien als ein Array hat. HierJavascript Rekursion Baum Gebäude

ist, was die flache Anordnung aussehen würde:

[ 
    { 
    "id": 1 
    }, 
    { 
    "id": 5, 
    }, 
    { 
    "id": 2, 
    "parent_id": 1 
    }, 
    { 
    "id": 3, 
    "parent_id": 1 
    }, 
    { 
    "id": 42, 
    "parent_id": 5 
    }, 
    { 
    "id": 67, 
    "parent_id": 5 
    } 
] 

Und das ist, was ich brauche um das Ergebnis zu sehen:

[ 
    { 
    "id":1, 
    "subcategories":[ 
     { 
     "id":2, 
     "parent_id":1 
     }, 
     { 
     "id":3, 
     "parent_id":1 
     } 
    ] 
    }, 
    { 
    "id":5, 
    "subcategories":[ 
     { 
     "id":42, 
     "parent_id":5 
     }, 
     { 
     "id":67, 
     "parent_id":5 
     } 
    ] 
    } 
] 

Ich habe versucht, diese rekursiv zu tun, indem rekursiv die Suche nach Kinder und befestige es als ein Array und weiterhin so zu tun, bis ich den Boden des Laufs, aber ich bekomme eine zyklische Struktur. Es scheint, dass die parent_id in Traverse ist immer die ID des Mutter ... irgendwelche Ideen:

tree(passingInFlatObjectHere); 

function topLevel (data) { 
    let blob = []; 
    data.forEach((each) => { 
    if (!each.parent_id) { 
     blob.push(each); 
    } 
    }); 
    return blob; 
} 

function tree (data) { 
    let blob = topLevel(data).map(function (each) { 
    each.subcategories = traverse(data, each.id); 
    return each; 
    }); 
    return blob; 
} 

function traverse (data, parent_id) { 
    let blob = []; 
    if (!parent_id) { 
    return blob; 
    } 
    data.forEach((each) => { 
    if (each.id === parent_id) { 
     each.subcategories = traverse(data, each.id); 
     blob.push(each); 
    } 
    }); 
    return blob; 
} 

Antwort

1

ich nicht nur helfen wollen Sie Ihr Problem beheben, sondern würde auch Sie in vollem Umfang nutzen gerne helfen

function topLevel(data) { 
    return data.filter(node => !node.parent_id); 
} 

Ordentlich ist es nicht:

ES6

Vor allem Ihre topLevel Funktion kann auf diese neu geschrieben werden? Ich würde auch empfehlen, etwas zu ändern tree für Konsistenz, aber das ist natürlich nur stilistisch.

function tree(data) { 
    return topLevel(data).map(each => { 
    each.subcategories = traverse(data, each.id); 
    return each; 
    }); 
} 

Keine logischen Probleme bisher. traverse enthält jedoch eins, wenn Sie each.id === parent_id überprüfen. Auf diese Weise sucht die Funktion nach dem Knoten mit der ID parent_id. Offensichtlich ein Fehler. Sie wollten each.parent_id === parent_id.

Ihr Problem ist jetzt gelöst. Hör auf zu lesen, wenn ich dich störe. Aber man könnte auch die Vorteile der filter nehmen hier und entfernen Sie diese leicht überflüssig vorzeitiges Ausscheiden und schreiben Sie Ihre Funktion:

function traverse(data, parentId) { 
    const children = data.filter(each => each.parent_id === parentId); 
    children.forEach(child => { 
    child.subcategories = traverse(data, child.id); 
    }); 
    return children; 
} 
+0

Wow Dank für die Hilfe und zeigt mir die alle schönen neuen Zucker in ES6. – Goodwin