为什么这个javascript代码返回undefined
why this javascript code return undefined?
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 !== '') {
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
我想通过给一个父节点来找到根节点。返回之前,我在函数findRoot
内的第一个控制台上得到了正确的结果。但是函数之外的控制台会变得不确定。
findRoot()
函数在进行第一次递归调用后不会返回任何内容。您想要的是以下内容:
if (node.pId !== '') {
return findRoot(getParentNode(node.pId, treeDataOld));
}
您正在使用递归调用,但没有返回任何内容,也许这就是原因,请尝试将return放在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
您的基本问题可以通过从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
,请使用polyfill或编写自己的。
我们还使用箭头函数——如果没有可用的,请使用标准函数表示法重写。
如果您想进一步重构,可以编写一个较低级别的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));
}
相关文章:
- RequireJS向模块传递配置总是返回undefined
- JSON数组数据返回Undefined
- JavaScript”;.方法“;返回undefined
- jQuery可以't获取data-*属性值,返回undefined
- Javascript/JSON警报返回Undefined
- Javascript:firstChild对象返回undefined
- 当尝试使用ajax读取文件时,变量返回undefined
- 如何避免JSON.stringify在特殊情况下返回undefined,从而为JSON.parse创建字符串失败
- 使用谷歌地图:一个返回undefined的自定义javascript函数
- Json在nodeJs和AngularJs中返回undefined
- 为什么像 Firefox 和 Chrome 控制台中的 '}{' 这样的结构会返回 'undefined'?
- 使用 HTML 和 JavaScript 从表单访问值时返回 undefined
- 在 CoffeeScript 中,当尝试调用类中的方法 (@_methodName) 时,它会返回 undefined
- 解析承诺'当'返回undefined(Javascript)
- NodeJS:zlib.gunzip(body)错误地返回“undefined”
- window.open在chrome扩展中返回undefined
- jQuery.pr()返回undefined,而.attr()对数据-*的作用与预期一样
- 正在读取嵌套json,jquery返回undefined
- IIFE是否总是返回undefined
- $timeout包装$http.post返回undefined而不是promise