2016-07-19 3 views
0

オブジェクトツリーを走査して、ネストされたプロパティを含むオブジェクトのすべてのプロパティを再帰を使用して印刷しようとしています。ここに私のコードがありますが、それはループの中で立ち往生しており、私は何が欠けているのか分かりません。オブジェクトツリーとプリントのプロパティをトラバースする

var data = { 
    person: { 
    firstName: 'Mary' 
    }, 
    color: 'blue' 
}; 

function walk(root) { 
    for(var i in root) { 
    if(root.hasOwnProperty(i)) { 
     console.log(i); 
     if (root[i] !== null && root[i] !== undefined && typeof(root[i] == 'object')) { 
     walk(root[i]); 
     }  
    } 
    } 
} 

walk(data); 
+2

開き、デバッガ、それを見つけます。 – zerkms

+2

'typeof(root [i] == 'オブジェクト')' - 本当にありますか? – Bergi

+0

@Bergiはデバッガの使い方を学ばせました;-)しかし、10秒後にはすでに回答が投稿されています。 – zerkms

答えて

1

注:このソリューションでは、ネストされた配列を横断するように更新されました。

私はそれを解決するために時間がかかりました、なぜなら彼のデバッギングツールで今演奏されている可能性があります(コメントを参照してください)でもこの問題の閉鎖したいです。

この問題に対する私のアプローチは、instanceof APIを使用して解決しました。
を参照してください:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/instanceof

私は

  1. root.hasOwnProperty(i)
  2. if (root[i] !== null && root[i] !== undefined && typeof(root[i] == 'object'))

のようなものを長いったらしいチェックを行うために、余分なコードに配置する必要はありませんその方法例:

var data = { 
    person: { 
    firstName: 'Mary', 
    likes: { 
     food: "apple", 
     drinks: "water", 
     d: null, 
     x : { 
     y: "z", 
     ddd: [ 
      { bbb: "lol"}, 
      { PPP: "lol2"} 
     ] 
     }, 
     o: undefined 
    } 
    }, 
    color: 'blue' 
}; 

function walk(root) { 
    for (let property in root) { 
    console.log(property); 
    if (root[property] instanceof Array) 
     root[property].forEach(item => { walk(item); }); 
    else if (root[property] instanceof Object) 
     walk(root[property]); 
    // Extend else if statement to handle customize structures appropriately. 
    } 
} 

walk(data); 

出力:

person 
firstName 
likes 
food 
drinks 
d 
x 
y 
ddd 
e 
bbb 
PPP 
o 
color 
+0

'Object'から継承しないオブジェクトでは機能しません(' Object.create(null) 'やクロスフレームオブジェクトのように) – Bergi

+0

@Bergiこれを指摘してくれてありがとう。私は再び解決策を検討します。私は配列がより多くのオブジェクトで構成されている配列の値を持つキーを持っていれば、それもうまくいかないと思います。例: 'ddd:[{bbb:" lol "}]'。 –

+0

ありがとう!コンソールデバッガの助けを借りて私自身の問題を解決することができました。私はそれのようなinstanceofを使用することを認識していませんでした。ありがとう! – Mdd

関連する問題