这是源数据。我想使用"你好"在源代码中,找到" up",最后,得到一个数组" [max,min]" (像多棵树,找到根)
var obj = {
'hello': {
"up": "world",
"down": "ccc"
},
'world': {
"up": ["max","min"],
"down": "hello"
},
'max': {
"up": null,
"down": "world"
},
'min': {
"up": null,
"down": "world"
},
'ccc': {
"up": "hello",
"down": null
}
}
我使用递归函数,但下面的代码不起作用。它返回" undefined"。 (如果" up"不是数组,则该功能有效。)
function findRoot(source,key){
var up = source[key]['up'];
if(up==null){
return key
}else{
if(Object.prototype.toString.call(up)=='[object Array]'){
up.forEach(function(d){
return findRoot(source,d);
})
}else{
return findRoot(source,up)
}
}
}
如何修复此代码?
答案 0 :(得分:1)
你不会在你的' if array'中返回任何内容。情况下:
if(Object.prototype.toString.call(up)=='[object Array]'){
up.forEach(function(d){
return findRoot(source,d);
})
// no return
如果您未指定退货,则JavaScript将默认返回undefined
。
另请注意,forEach
函数不会对从函数返回的值执行任何操作。一种替代方法是使用map
函数,然后再次返回该数组:
var results = up.map(function(d) {
return findRoot(source, d);
});
return array;
然而,这可能也不是您打算做的。由于您的代码唯一的基本情况是当值为null时,您的函数将永远只返回null,或者包含null的数组,而不是有意义的数组。例如,调用findRoot(obj, 'hello');
将返回[null, null]
,这可能不是您想要的。
如果是这种情况,您可能需要重新考虑您的递归函数究竟要做什么+查看添加更多基本案例,或修改现有基础和递归案例。
答案 1 :(得分:0)
问题是你在forEach()
循环中的匿名函数内部返回,但实际上没有为findRoot()
返回任何内容,所以默认情况下它会返回undefined
。
up.forEach(function(d){
return findRoot(source,d);//doesn't return for **findRoot()** just for anonymous function.
});
如果有多个根节点,则可以返回根节点数组。您可以将返回值推送到array
,然后返回数组。如果不超过一个,你可以像往常一样返回。这是一个例子:
function findRoot(source,key){
var up = source[key]['up'];
if(up==null){
return key
}else{
if(Object.prototype.toString.call(up)=='[object Array]'){
var temp = new Array();
up.forEach(function(d){
temp.push(findRoot(source,d));
});
return temp;
}else{
return findRoot(source,up)
}
}
}
如果您有一个数组,它将返回如下:
如果您没有数组,它将返回如下:
然后,您可以检查返回是否为数组,并执行返回所需的操作。另一种选择是始终返回一个数组,如果只有一个元素,则数组中只有一个元素。