2015-11-30 73 views
1

我想写一个函数来搜索一个元素的对象并返回它的父数组。这段代码看起来应该起作用,但它只返回undefined,有人可以解释为什么吗?javascript递归发现没有返回

findInArray = function(el, obj) { 

if(Array.isArray(obj)){ 

    obj.forEach(function(element) { 
     if(element === el) { 

     return obj; 

     } else if (typeof element === 'object' && obj) { 

     return findInArray(el, element); 
     } 
    }) 

} else if(typeof obj === 'object' && obj) { 

    for(prop in obj) { 

     if(typeof obj[prop] === 'object' && obj) { 

      return findInArray(el, obj[prop]); 
     } 
    } 
} 

} 
+0

你不从'if'块返回。嵌套函数中的'return'语句不会以任何方式影响它们的外部函数。这是一个简化的例子:'function foo(){function bar(){return 42; }}。当被调用时,'foo'返回什么? –

+0

@FelixKling你能详细点吗? –

+0

@FelixKling是的,但你不叫酒吧? –

回答

0

你是不是从第一if块返回:

if(Array.isArray(obj)){ 
    obj.forEach(...) 
} 

因此函数返回undefined。如果你想返回回调的值,你必须重构你的代码。

看来Array#reduce将是适当的位置:

return obj.reduce(function(result, element) { 
    if (result) { 
    return result; 
    } 
    if(element === el) { 
    return obj; 
    } 
    if (typeof element === 'object' && obj) { 
    return findInArray(el, element); 
    } 
}, null); 
+0

整洁的解决方案,thx! –

+0

为什么如果设置了初始值,它肯定会始终设置? –

+0

你的意思是结果?只有在任一条件为“真”的情况下才会设置。它不会一直设置。 –