Recursiv函数总是返回undefined,即使它不是

时间:2017-01-02 19:12:53

标签: javascript

示例树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": "ad.ads@aas.dssae"
    }
    ]
}

代码

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。但是如果你在 getHierarchyData()中使用console.log 层次结构,那么它永远不会被定义。 getHierarchyData()应该返回一个数据数组。

怎么了?

2 个答案:

答案 0 :(得分:1)

如果getHierarchyData未在树的根中找到被搜索的人,则它会从函数的底部掉出并返回undefined。如果它在树的根中找到了人,则返回undefined。注意hierarchy在调用slice时复制getHierarchyData(child,hierarchy.slice()...(为什么?)并且放弃了调用的返回值:没有代码报告在子节点中查找人员树。

似乎缺少的是“找到”标志,既可以停止进一步的递归,也可以识别找到的人不应该包含在层次结构中的树枝。实现找到的标志可以通过各种方式完成,但只是下面代码中hierarchy数组的属性。

getHierarchyData的一种可能结构,它在找到一个人后返回,并为{false}分支弹出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;
}

未包含对应用程序对象结构的引用,并且检查某人是否在树中有重复记录需要单独验证。

答案 1 :(得分:0)

解决了创建类变量this.data的问题。然后就是:

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