2017-01-02 65 views
-2

例树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]" 
    } 
    ] 
} 

代码

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()总是返回undefined。但如果你的console.log 层次结构 getHierarchyData(),它从来没有定义。 getHierarchyData() ist应该返回一个数组数组。Recursiv函数总是返回undefined,即使它不是

怎么了?

+0

请提供一个完整的例子。看看[mcve]。 –

回答

1

如果getHierarchyData未在树的根中找到正在搜索的人,则它将落在该函数的底部并返回undefined。如果它发现树中根的人不是返回undefined。当呼叫getHierarchyData(child,hierarchy.slice()...(为什么?)时,通知hierarchy被复制使用slice,并且呼叫的返回值被丢弃:没有代码报告在树的子节点中找到一个人。

似乎缺少的是一个“找到”标志,以停止进一步的递归,并确定树分支的人是而不是发现哪些不应该包括在层次结构中。实现找到的标志可以通过不同的方式完成,但仅仅是下面代码中hierarchy数组的属性。

一个可能的结构getHierarchyData,找到后,一个人返回并弹出项关闭hierarchy假树枝,

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; 
} 

引用到应用程序的对象结构没有被包括在内,检查人是否有重复树中的记录需要单独验证。

+0

我需要'hierarchy.slice()'来保存数据,但同时销毁引用。 hirarchy就像一个历史,我需要存储的节点,直到我找到我的节点,我正在寻找。当我找到节点时,我只需将历史/路径返回给节点。所以我不是那个人,我想要走向他的道路。 **它落在函数的底部并返回undefined **,但当达到节点时,它进入if。之后它只是返回并结束递归。 – Muco

+0

从递归函数返回时,在紧接其调用后的位置恢复执行。如果这在以前调用'getHierarchyData'的'if(tree.children)'分支中,则该(之前)调用返回'undefined'。你不妨尝试一下答案,看看它有什么作用。 – traktor53

+0

现在它返回数据,但它失去了我想要的功能。没有切片,我没有得到正确的数据。 – Muco

0

解决bei创建类变量this.data。然后只是:

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