2016-01-12 2 views
0

Я получаю данные от вызовов API Google Книги, и я собираю данные в более легкий массив, с которым я могу работать. Я использую эту строку, чтобы отобразить данные я заинтересован в:Избегайте ошибки «Невозможно прочитать свойство неопределенной» при сопоставлении данных

data.items.map(function(book) { 
    return { googleId : book.id, image : book.volumeInfo.imageLinks.thumbnail, authors : reduceAuthors(book.volumeInfo.authors), title : book.volumeInfo.title, subtitle : book.volumeInfo.subtitle, publishedDate : book.volumeInfo.publishedDate, publisher : book.volumeInfo.publisher} 
}); 

Большую часть времени она работает просто отлично, но несколько раз один из элементов отсутствует, то это может быть imagelinks или authors поэтому получите эту ошибку "Uncaught TypeError: Cannot read property of undefined".

Каков наилучший способ избежать этой ошибки?

Единственное решение, которое я имею в виду, это сначала запустить проверку работоспособности по всем данным и применить карту только после этого, но может быть, лучшее решение? И обертывание всего в попытке и улове выкидывает меня из операции сопоставления слишком рано и не дополняет остальные данные.

+0

Проверка ваших входящих данных - это, безусловно, лучшее решение. Это позволит вам очень решительно решить, как обрабатываются недостающие данные, и обеспечивает более надежный подход к обработке ошибок. – CollinD

ответ

1

Вы можете проверить его внутри map() функция, без ручки ранее все данные. При тройном условном, что-то вроде этого:

image : ((book.volumeInfo.imageLinks) ? book.volumeInfo.imageLinks.thumbnail : undefined) 

Так что если book.volumeInfo.imageLinks является нулевым/пустой/неопределенными там не ошибка, а значение вставлено будет undefined, в противном случае поймать значение эскиза.

+0

Но OP должен будет проверить каждое свойство, а затем назначить ключ, если он есть, например 'if (book.volumeInfo && book.volumeInfo.imageLinks && book.volumeInfo.imageLinks.thumbnail) output.image = book.volumeInfo. imageLinks.thumbnail'. Не идеально ... Я бы рекомендовал использовать что-то вроде lodash '_.get' и' _.set' – elclanrs

+0

Вообще говоря, это может быть не идеально, но отлично работает в моем случае. Я получаю ошибку всякий раз, когда пытаюсь получить доступ к вложенному свойству с неопределенным родителем, и я делаю это только с изображением и автором, поэтому мне просто нужно проверить два раза, а не один раз для каждого свойства. – NicolaF

Смежные вопросы