findRoot

我想通过给出父节点来找到根节点。在返回之前,我在函数{{1}}内的第一个控制台得到了正确的结果。但是函数外的控制台得到了UNDEFINED。
答案 0 :(得分:2)
findRoot()
函数在进行第一次递归调用后不返回任何内容。你想要的是以下几点:
if (node.pId !== '') {
return findRoot(getParentNode(node.pId, treeDataOld));
}
答案 1 :(得分:0)
您正在使用递归通话,但是您没有返回任何内容,可能这是原因,请尝试在findRoot(getParentNode(node.pId, treeDataOld));
之前返回,而不是使用此return findRoot(getParentNode(node.pId, treeDataOld));
var treeDataOld = [
{id: '1', pId: '', name: 'root1', checked: false},
{id: '2', pId: '', name: 'root2', checked: false},
{id: '3', pId: '', name: 'root3', checked: true},
{id: '4', pId: '1', name: 'child', checked: true},
{id: '5', pId: '4', name: 'child', checked: false},
{id: '6', pId: '5', name: 'child', checked: false},
{id: '7', pId: '6', name: 'child', checked: false},
{id: '8', pId: '7', name: 'child', checked: true},
{id: '9', pId: '8', name: 'child', checked: false},
];
function findRoot(node) {
var getParentNode = function (node, refArray) {
var len = refArray.length;
for (var i = 0; i < len; i++) {
if (refArray[i].id === node) {
return refArray[i];
}
}
};
if (node.pId !== '') {
return findRoot(getParentNode(node.pId, treeDataOld));
} else {
console.log(node); // I got OBJECT here
return node;
}
}
var rootNode = findRoot(treeDataOld[8]);
console.log(rootNode); // here is UNDEFINED
&#13;
答案 2 :(得分:0)
您可以通过返回findRoot
的值来解决您的基本问题,如其他答案所示。但是,通过将代码简化为:
function findRoot(node) {
var findParentNode = (id, refArray) => refArray.find(node => node.id === id);
var pId = node.pId;
return !pId ? node : findRoot(findParentNode(pId, treeDataOld));
}
现在,经典递归模式 - 检查基本情况,然后是递归情况 - 清晰可见。
我们在这里使用Array#find
来分解基本查找逻辑,因此不会使您的算法混乱。如果您没有Array#find
可用,请使用填充或自己编写。
我们还使用箭头功能 - 如果您没有这些功能,请使用标准功能表示法重写。
如果您想进一步重构,可以编写一个较低级别的findByProp
来根据其中一个属性的值查找特定的数组元素:
function findByProp(array, prop, value) {
return array.find(elt => elt[prop] === value);
}
现在你可以把它写成
function findRoot(node) {
var findParentNode = (value, array) => findByProp(array, 'id', value);
var pId = node.pId;
return !pId ? node: findRoot(findParentNode(pId, treeDataOld));
}
或者如果你喜欢单行
function findRoot(node) {
return !node.pId ? node : findRoot(findByProp(treeDataOld, 'id', node.pId));
}