2011-07-01 10 views
9

stosując następującą paszę:Sprawdzanie czy element istnieje w json

http://api.twitter.com/1/statuses/user_timeline.json?screen_name=microsoft&include_rts=1&count=10

jestem w stanie z powodzeniem pętli to aby uzyskać szczegóły chcę wyświetlić na mojej stronie html.

Muszę jednak sprawdzić, czy istnieje retweeted_status.user.profile_image_url i nie jestem pewien, jak to zrobić?

Obecnie jestem przelotowego danych gdzie data jest zwracany przez jquery-ajax:

data[i].retweeted_status.user.profile_image_url

jeśli data[i].retweeted_status.user.profile_image_url nie istnieje, to nie zwraca wartość null lub undefined, po prostu pojawia się następujący błąd:

cannot read property 'user' of undefined

+4

if (dane [i] .retweeted_status && data [i] .retweeted_status.user && data [i] .retweeted_status.user.profile_image_url) – Abhijit

+0

@Ahhijit, proszę dodać to jako odpowiedź. – oshirowanen

Odpowiedz

27

Ten komunikat o błędzie wskazuje, że zarówno dane [i] lub Twój retweeted_status jest nieokreślony, co oznacza, y nasze wezwanie do uzyskania jsona najprawdopodobniej zawodzi. Kiedy dane są zwracane z Twittera, będzie ono zawierało adres URL obrazu profilu, ponieważ pokazuje obraz podobny do jajka dla osób, które nie zostały przesłane. Należy umieścić to przed swoimi pętli for:

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

Jeśli tweet jest retweet, chcę uzyskać adres REtweeted_status.user.profile_image_url, a nie user.profile_image_url. Są to 2 różne elementy. Zapoznaj się z linkiem json zamieszczonym powyżej. – oshirowanen

0

Jeśli pętli i dostępu do zagnieżdżenia obiektów:

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 */ 
} 

Pętla ta nie musi już korzystać z indeksów tablicy, która nie jest najbardziej wydajny, chyba konkretnie potrzebujesz indeksu na coś. Zamiast tego wyskakuje pierwszy element z tablicy i bezpośrednio korzysta z tego obiektu. Wewnętrzne pętle mogą następnie sprawdzić istnienie właściwości na tweet_data.

staram się unikać używania więcej niż 1 stopień od wyłuskania dla 2 powodów (jak objA.child.property): 1) można sprawdzić istnienie obiektu od samego początku, a jeśli jej nie ma, albo wyskoczyć domyślne przypisanie wartości. 2) Za każdym razem JavaScript musi uzyskać dostęp do metody property, najpierw musi znaleźć child z objA, a następnie uzyskać dostęp do property. W dużych pętlach może być wolny.

0

Spójrz na $.grep(). Pomaga w przechwytywaniu obiektów JSON. Użyłem go na podanym przez ciebie linku. Używałem go do przechwytywania tweetów i znajdowania przekierowanych obrazów użytkownika. Można spojrzeć na mój kod tutaj: http://jsfiddle.net/q5sqU/7/

0

Inną rzeczą, jaką możesz zrobić, który pracował dla mnie:

if(retweeted_status) { 
    // your code 
} 
8

myślę, że to dobra odpowiedź:

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

... lub jeszcze lepiej:

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

To jest dokładna odpowiedź, ale zastanów się nad pierwszą najlepszą opcją, drugą najlepszą, i wyjaśnij dlaczego. – Cypher909