{
"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()应该返回一个数据数组。
怎么了?
答案 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;
}