2010-03-06 50 views
2

爲什麼這隻會提醒1?遞歸函數循環通過obj道具不起作用

function test() { 
var myobj = { 
    a : '1st level prop', 
    b : 'findme', 
    c : { 
    aa : '2nd level prop', 
    bb : 'findme', 
    cc : { 
    aaa : '3rd level prop', 
    bbb : 'findme' 
    } 
    } 
} 
function countem(needle,haystack) { 
    var count = count || 0; 
    for(var i in haystack) { 
    if (typeof(haystack[i]) == 'object') { 
    countem(needle,haystack[i]); 
    } else { 
    if (needle == haystack[i]) { 
    count++; 
    } 
    } 
    } 
    return count; 
} 
alert(countem('findme',myobj)); 
} 
+0

我對JavaScript並不完全熟悉,但是在數組和對象之間沒有區別嗎?在我看來,'typeof(haystack [i])=='object''返回false,因此只計算它找到的第一個。此外,它應該添加計數的結果,因爲它啓動了一個新的函數... – animuson 2010-03-06 19:17:06

+0

@animuson:你不熟悉JavaScript,這是你如何看待對象的屬性。 – Hogan 2010-03-06 19:22:09

回答

2

您忘了在遞歸調用中添加計數。

function test() { 
var myobj = { 
    a : '1st level prop', 
    b : 'findme', 
    c : { 
    aa : '2nd level prop', 
    bb : 'findme', 
    cc : { 
    aaa : '3rd level prop', 
    bbb : 'findme' 
    } 
    } 
} 
function countem(needle,haystack) { 
    var count = 0; 
    for(var i in haystack) { 
    if (typeof(haystack[i]) == 'object') { 
    count = count + countem(needle,haystack[i]); 
    } else { 
    if (needle == haystack[i]) { 
    count++; 
    } 
    } 
    } 
    return count; 
} 
alert(countem('findme',myobj)); 
} 
+0

或'count + = countem(needle,haystack [i]);'用於保存字節的文件。 – 2010-03-06 19:34:21

+0

是的,這是解決方案, 出於某種原因,我曾認爲伯爵會從內部函數中排序,但我想我明白爲什麼不會發生。謝謝您的幫助! – Karl 2010-03-06 21:12:39

2

,因爲你在每次調用countem重置count

if (typeof(haystack[i]) == 'object') { 
    count += countem(needle,haystack[i]); 
}