2009-08-17 9 views
0

ajaxアプリケーションを構築する際には、通常、リモートデータをJSON形式で取得することをお勧めします。しかし、階層が予測不可能な場合(specifically geocoding responses from Google Maps API)、DOMメソッドのgetElementsByTagNameは階層内のどこにでもデータを取得するため、XML形式にすることが魅力的です。関心のあるタグ/名前を持つ要素/プロパティが1つしかないと仮定すると、次の関数はgetElementsByTagNameと効率的に同等ですか?どのように改善することができますか?JSONオブジェクトの予測不可能な階層

function findProperty(obj,prop){ 

     for(var p in obj){ 
      if(p==prop){ 
        return obj[p]; 
      } 
      if(obj[p] instanceof Object){ 
       var tmp = findProperty(obj[p],prop); 
       if(tmp){ 
        return tmp; 
       } 
      } 

     } 
} 

答えて

2

あなたの関数は、多くのDOMトラバーサル関数が行うかなり直線的な線形検索のようです。つまり、プロトタイプツリーからプロパティを取得しないようにするには、hasOwnPropertyチェックを追加する必要があります。例えばまた

for(var p in obj) { 
    if(obj.hasOwnProperty(p)) { 
     ... 
    } 
} 

常に使用===の代わりにJSで==(これは、JSではなく、悪い、型変換を避けます)。私はまた、instanceofステートメントが、あなたが思っていることをしているかどうか確信していません。代わりに、代わりに

obj[o].constructor === Object 

を代わりに使用します。

+1

'instanceof'はここで' constructor'のチェックと同じでなければなりませんが、両方とも他のフレームからオブジェクトを "マッチ"できません。 Safari <2.0.4のような古いクライアントでは、 'hasOwnProperty'が欠けていることを覚えておくと良いでしょう。 – kangax

+0

instanceof *は同じでなければなりませんが、FF 3.5の例では、次のようにfalseを返します: "as" instanceof String これはtrueを返します。 "as" .constructor === String – illvm

関連する問題