2015-11-30 101 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

你的意思是結果?只有在任一條件爲「真」的情況下才會設置。它不會一直設置。 –