2016-07-14 4 views
1

再帰を使用してネストされたオブジェクトや配列の文字列を含むオブジェクトの文字列の数を数えようとしています。なぜ私は7の代わりに3を得ているのですか?この再帰関数で何が問題になっていますか?

function strCount(obj, count = 0){ 
 
    for (var key in obj) { 
 
    if (typeof obj[key] === 'object') { 
 
     strCount(obj[key], count); 
 
    } else if (typeof obj[key] === 'string') { 
 
     count++; 
 
    } 
 
    } 
 
    return count; 
 
} 
 

 
var myobj = { 
 
    first: "1", 
 
    second: "2", 
 
    5: 'sd', 
 
    third: false, 
 
    fourth: ["anytime",2,3,4], 
 
    fifth: null, 
 
    sixth: undefined, 
 
    seventh:{ ana: 'hell', did: 5, boo : 'foo', har : ['kill', 5]} 
 
}; 
 

 
alert(strCount(myobj));

+4

あなたは再帰的に 'strCount'を呼び出し、その戻り値を無視しています。 – Bergi

+0

呼び出し元のスコープ内で 'count'変数を増やすことはありません。すべての呼び出しには独自の 'count'があります。 – Bergi

答えて

3

countに再帰呼び出しの結果を追加することを忘れないでください:

function strCount(obj) { 
 
    var count = 0; 
 
    for (var key in obj) { 
 
    if (typeof obj[key] === 'object') { 
 
     count += strCount(obj[key]); 
 
    } else if (typeof obj[key] === 'string') { 
 
     count++; 
 
    } 
 
    } 
 
    return count; 
 
} 
 

 
var myobj = {first:"1",second:"2",5:'sd',third:false,fourth:["anytime",2,3,4],fifth:null,sixth:undefined,seventh:{ana:'hell',did:5,boo:'foo',har:['kill',5]}}; 
 

 
alert(strCount(myobj));

1

あなたの第四行を変更する必要があります〜count = strCount(obj[key], count);

function strCount(obj, count = 0) { 
 
    for (var key in obj) { 
 
    if (typeof obj[key] === 'object') { 
 
     count = strCount(obj[key], count); 
 
    } else if (typeof obj[key] === 'string') { 
 
     count++; 
 
    } 
 
    } 
 
    return count; 
 
} 
 

 

 

 
var myobj = { 
 
    first: "1", 
 
    second: "2", 
 
    5: 'sd', 
 
    third: false, 
 
    fourth: ["anytime", 2, 3, 4], 
 
    fifth: null, 
 
    sixth: undefined, 
 
    seventh: { 
 
    ana: 'hell', 
 
    did: 5, 
 
    boo: 'foo', 
 
    har: ['kill', 5] 
 
    } 
 
}; 
 

 
alert(strCount(myobj));

関連する問題