2010-03-06 72 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]); 
}