为什么这个javascript代码返回undefined?

时间:2015-11-21 04:18:26

标签: javascript



findRoot




我想通过给出父节点来找到根节点。在返回之前,我在函数{{1}}内的第一个控制台得到了正确的结果。但是函数外的控制台得到了UNDEFINED。

3 个答案:

答案 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;
&#13;
&#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));
}