2015-08-03 87 views
0

这是源数据。我想用“你好”的来源,找到“向上”,最后得到一个数组“[最大值,最小值]”(如多树,找到根)我如何使用递归函数来处理数组?

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 
    } 

} 

我使用递归函数,但下面的代码不起作用。它返回“未定义”。 (如果“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) 
     } 

    } 
} 

我该如何解决此问题?

+1

您可以加入预期的输出? – cjds

+0

该功能的目标不明确。 – plalx

回答

1

你没有你的“如果阵列”案中任何回报:

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的数组,而不是有意义的。例如,拨打findRoot(obj, 'hello');将返回[null, null],这可能不是您想要的。

如果是这样的话,你可能要重新思考,究竟你的递归函数的意思做+看增加更多基础的情况下,或者修改现有的基础和递归的情况。

0

问题是你在你的forEach()循环中的匿名函数中返回,它实际上并没有返回任何东西,因此默认情况下它返回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) 
     } 

    } 
} 

如果你有一个数组将返回这样的:

enter image description here

如果你没有一个数组将返回这样的:

enter image description here

然后,您可以检查是否返回的是一个数组或不和你需要返回做什么。另一种选择是总是返回一个数组,如果只有一个元素,那么数组中只有一个元素。