web-dev-qa-db-ja.com

要素がjsonに存在するかどうかを確認する

次のフィードを使用します。

http://api.Twitter.com/1/statuses/user_timeline.json?screen_name=Microsoft&include_rts=1&count=1

これをループして、htmlページに表示したい詳細を取得することができます。

ただし、retweeted_status.user.profile_image_url存在しますが、その方法がわかりませんか?

現在、jquery-ajaxによってdataが返されるデータをループしています。

data[i].retweeted_status.user.profile_image_url

if data[i].retweeted_status.user.profile_image_urlが存在せず、nullまたは未定義を返さないため、次のエラーが発生します。

cannot read property 'user' of undefined

10
oshirowanen

このエラーメッセージは、data [i]またはretweeted_statusのいずれかが未定義であることを示しています。これは、jsonを取得するための呼び出しが失敗している可能性が高いことを意味します。 Twitterからデータが返されると、プロフィール画像のURLが表示されます。これは、アップロードされていない人には卵のような画像が表示されるためです。これをforループの前に置く必要があります。

if (typeof(retweeted_status) != "undefined")
{
//code for what to do with json here
}
28
Liam Bailey

私はそれが良い答えだと思います:

if('key' in myObj)
10
z_inx
if (something !== undefined) {
   ...
}

...またはさらに良い:

if (typeof something != "undefined") {
    ...
}
1

ネストオブジェクトをループしてアクセスしている場合:

if(!data)
    return;

while(data.length)
{
    var Tweet_data = data.shift();

    /* do some work */

    if(!Tweet_data|| !Tweet_data.retweeted_status)
        continue;

    var retweeted_status = Tweet_data.retweeted_status;

    /* do your other work */
}

このループでは、配列インデックスを使用する必要がなくなりました。これは、何かのインデックスが特に必要でない限り、最も効率的ではありません。代わりに、最初の要素を配列からポップし、そのオブジェクトを直接使用します。ループ内部は、Tweet_dataのプロパティの存在を確認できます。

2つの理由(objA.child.propertyなど)のために、複数レベルの間接参照の使用を避けようとしています。1)オブジェクトの存在を最初から確認でき、存在しない場合は、ジャンプしてデフォルト値を割り当てることができます。 。 2)JavaScriptがメソッドpropertyにアクセスする必要があるたびに、最初にchildを使用してobjAを見つけ、次にpropertyにアクセスする必要があります。大きなループでは遅くなる可能性があります。

0
Dino Gambone

あなたができるもう一つのことは、私のために働いています:

if(retweeted_status) {
  // your code
}
0
Max Stern

$。grep() を見てください。 JSONオブジェクトをループするのに役立ちます。あなたが提供したリンクでそれを使用しました。ツイートをループして、リツイートされたユーザー画像を見つけるために使用しました。ここで私のコードを見ることができます: http://jsfiddle.net/q5sqU/7/

0
Chris Marais