2017-01-02 5 views
-2

Beispiel Baum ist this.props.rodexMatrixData

{ 
"id": "41_0", 
"staffNumber": "800001", 
"firstName": "adsadsad", 
"lastName": "adssadsad", 
"role": "CEO", 
"phoneNumber": "+4453544534", 
"salary": 25000, 
"children": [ 
    { 
     "id": "42_0", 
     "staffNumber": "800010", 
     "firstName": "sda", 
     "lastName": "asaas", 
     "role": "CTO", 
     "phoneNumber": "+44874331234", 
     "salary": 20000, 
     "email": "[email protected]" 
    } 
    ] 
} 

-Code

incForFakeLevel(fakeLevel) { 
    return ++fakeLevel; 
} 

mapHierarchy(){ 
    let mappedHierarchy = []; 
    let hierarchyData = this.getHierarchyData(this.props.rodexMatrixData) //always undefined 

    if (hierarchyData){ 
     for (let person of hierarchyData){ 
      let margin = 10 * person.level; 
      mappedHierarchy.push(<div style={{marginLeft: `${margin}px`}}>{person.name}</div>) 
     } 
    } 

    return mappedHierarchy 
} 

getHierarchyData(tree, hierarchy = [], fakeLevel = 1){ 
    if (!this.props.selectedPerson) 
     return []; 

    hierarchy.push({ 
     name: `${tree.firstName} ${tree.lastName}`, 
     level: fakeLevel 
    }); 

    if (tree.staffNumber === this.props.selectedPerson.staffNumber){ 
     return hierarchy; // never undefined 
    } 


    if (tree.children){ 
     tree.children.forEach(child => 
      this.getHierarchyData(child,hierarchy.slice(), this.incForFakeLevel(fakeLevel)) 
     ); 
    } 
} 

getHierarchyData() immer undefiniert zurückgibt. Aber wenn Sie console.log Hierarchie in getHierarchyData(), ist es nie undefiniert. getHierarchyData() soll ein Array von Daten zurückgeben.RECURSIV Funktion gibt immer undefiniert, auch wenn es nicht

Was ist los?

+0

Bitte ein komplettes Beispiel angeben. Schauen Sie sich [mcve] an. –

Antwort

1

Wenn getHierarchyData die Person, nach der gesucht wird, nicht im Stammverzeichnis des Baums findet, fällt sie aus dem unteren Rand der Funktion und gibt zurück. Wenn es die Person in der Wurzel des Baumes findet, tut es nicht zurückgeben undefined. Hinweis hierarchy wird mit slice kopiert, wenn getHierarchyData(child,hierarchy.slice()... aufgerufen wird (warum?) Und der Rückgabewert des Aufrufs verworfen wird: Es gibt keinen Code zum Melden einer Person in einem untergeordneten Knoten des Baums.

Was zu fehlen scheint, ist ein „gefunden“ Flag sowohl weitere Rekursion stoppen und auch Baumzweige identifizieren, wo die Person wurde nicht gefunden, die nicht in der Hierarchie enthalten sein sollten. Das Implementieren des gefundenen Flags kann auf verschiedene Arten erfolgen, ist jedoch einfach eine Eigenschaft des Arrays hierarchy im folgenden Code.

Eine mögliche Struktur für getHierarchyData, die für falsche abzweigt hierarchy zurückkehrt, nachdem eine Person zu finden, und knallt Einträge,

function getHierarchyData(tree, hierarchy = [], level = 1){ 
    if (!selectedPerson) 
     return []; 

    hierarchy.push({ 
     name: `${tree.firstName} ${tree.lastName}`, 
     level: level 
    }); 

    if (tree.staffNumber === selectedPerson.staffNumber){ 
     hierarchy.personFound = true; 
     return hierarchy; // never undefined 
    } 

    if (tree.children){ 
     for(let i = 0; i < tree.children.length; ++i) { 
      getHierarchyData(tree.children[i], hierarchy, level+1); 
      if(hierarchy.personFound) { 
       return hierarchy; 
      } 
     } 
    } 
    hierarchy.pop(); 
    return hierarchy; 
} 

Verweise auf die Objektstruktur der Anwendung sind enthalten und die Überprüfung nicht, wenn eine Person Duplikat hat Datensätze in der Struktur müssen separat überprüft werden.

+0

Ich brauche 'hierarchy.slice()', um die Daten zu halten, aber die Referenz zur gleichen Zeit zu zerstören. Die Hierarchie ist wie eine Geschichte, ich muss alle Knoten speichern, bis ich meinen Knoten finde, nach dem ich gesucht habe. Wenn ich den Knoten finde, gebe ich einfach den Verlauf/Pfad zum Knoten zurück. Also ich nicht die Person, ich will den Weg zu ihm. ** es fällt aus der Unterseite der Funktion und gibt undefined ** zurück, aber es kommt in die Wenn, wenn der Knoten erreicht ist. Danach kehrt es zurück und beendet die Rekursion. – Muco

+0

Die Rückkehr von einer rekursiven Funktion setzt die Ausführung an dem Punkt unmittelbar nach ihrem Aufruf fort. Wenn dies innerhalb des 'if (tree.children)' Zweiges eines vorherigen Aufrufs von 'getHierarchyData' ist, gibt dieser (vorherige) Aufruf 'undefined' zurück. Vielleicht möchten Sie die Antwort versuchen, um zu sehen, was es tut. – traktor53

+0

Nun gibt es Daten zurück, aber es verlor die Funktion, die ich wollte. Ohne die Scheibe bekomme ich nicht die richtigen Daten. – Muco

0

Gelöst beim Erstellen einer Klassenvariablen this.data. Dann einfach:

if (tree.staffNumber === this.props.selectedPerson.staffNumber) { 
    this.data= hierarchy; 
} 
Verwandte Themen