Проверка наличия элемента в json

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

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

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

однако, мне нужно проверить, если и я не уверен, как это сделать?

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

data[i].retweeted_status.user.profile_image_url

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

cannot read property 'user' of undefined

6 ответов


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

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

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

if('key' in myObj)

if (something !== undefined) {
   ...
}

... или еще лучше:

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

если вы цикл и доступ к вложенности объектов:

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 уровня разыменования по 2 причинам (например,objA.child.property): 1) Вы можете увидеть существование объекта с самого начала, и если он не существует, выпрыгнуть или присвоить значения по умолчанию. 2) каждый раз, когда JavaScript должен получить доступ к методу property, он сначала должен найти child withing objA, а затем property. Может быть медленным в больших петлях.


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


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

if(retweeted_status) {
  // your code
}