Проверка существования элемента в json - PullRequest
10 голосов
/ 01 июля 2011

используя следующий канал:

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

Я успешно могу пройти через это, чтобы получить детали, которые я хочу отобразить на моей html-странице.

Однако мне нужно проверить, существует ли retweeted_status.user.profile_image_url, и я не уверен, как это сделать?

В настоящее время я перебираю данные, в которых jquery-ajax возвращает data:

data[i].retweeted_status.user.profile_image_url

если data[i].retweeted_status.user.profile_image_url не существует, он не возвращает нулевое или неопределенное значение, я просто получаю следующую ошибку:

cannot read property 'user' of undefined

Ответы [ 6 ]

28 голосов
/ 01 июля 2011

В этом сообщении об ошибке указывается, что либо ваши данные [i], либо ваш retweeted_status не определены, что означает, что ваш вызов для получения json, скорее всего, будет неудачным. Когда данные возвращаются из Twitter, они всегда будут иметь URL-адрес изображения профиля, потому что они показывают яйцевидное изображение для тех, кто не загружен. Вы должны поставить это перед циклом for:

if (typeof(retweeted_status) != "undefined")
{
//code for what to do with json here
}
10 голосов
/ 05 февраля 2014

Я думаю, что это хороший ответ:

if('key' in myObj)
1 голос
/ 09 января 2016
if (something !== undefined) {
   ...
}

... или даже лучше:

if (typeof something != "undefined") {
    ...
}
0 голосов
/ 26 января 2012

Еще одна вещь, которую вы можете сделать, которая сработала для меня:

if(retweeted_status) {
  // your code
}
0 голосов
/ 01 июля 2011

Взгляните на $. Grep () . Это помогает вам перебирать объекты JSON. Я использовал его по предоставленной вами ссылке. Я использовал его, чтобы просмотреть твиты и найти ретвитированные изображения пользователей. Вы можете посмотреть мой код здесь: http://jsfiddle.net/q5sqU/7/

0 голосов
/ 01 июля 2011

Если вы зацикливаетесь и получаете доступ к вложенным объектам:

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.

Я стараюсь избегать использования более 1 уровня разыменования по двум причинам (например, objA.child.property): 1) Вы можете проверить существование объекта с самого начала и, если он не существует, выпрыгнуть или назначить значения по умолчанию. 2) Каждый раз, когда JavaScript должен получить доступ к методу property, он сначала должен найти child с objA, а затем получить доступ к property. Может быть медленным в больших циклах.

...