2015-10-01 2 views
1

Je récupère des données json à partir d'un flux RSS via YQL. Lorsqu'il y a plusieurs éléments dans le tableau des résultats, tout fonctionne comme prévu.Confusion de UnEtype TypeError: Impossible de lire la propriété 'n' de indéfini qui ne se produit que lorsque le résultat JSON a un seul élément, pourquoi?

Quand il n'y a qu'un seul élément dans le tableau des résultats, cependant, je reçois l'erreur suivante:

Uncaught TypeError: Cannot read property 'content' of undefined

Ceci est le bit de code correspondant lorsque la variable est définie à partir du résultat JSON. La propriété « content » référencé dans l'erreur est de la isbn variable $ où je suis preneuse le guid.content pour chaque élément dans les résultats:

if (data.query.count > 0) { 
    $.each(data.query.results.item, function(i, book) { 
    var $title = book.title; 
    var $url = book.link; 
    var $description = book.description; 
    var $isbn = book.guid.content.split(' ', 1); 

Voici les données JSON qui est retourné pour le flux rss que n'a qu'un seul résultat JSON Data:

{ 
    query: { 
    count: 1, 
    created: "2015-10-01T08:31:51Z", 
    lang: "en-US", 
    results: { 
     item: { 
     title: "Hi-5. Sharing stories [videorecording] : Spin me round.", 
     link: "http://webpac.sutherlandshire.nsw.gov.au/record=b1252345*eng", 
     description: "The big story book is open and Hi-5 are sharing all their story fun with you!", 
     guid: { 
      isPermaLink: "false", 
      content: "9398711204390" 
     } 
     } 
    } 
    } 
} 

Cependant, le même code fonctionne parfaitement bien quand je demande les données JSON à partir d'un flux rss avec plusieurs éléments. Il n'y a pas d'erreur et la variable $ isbn est définie et utilisée.

J'ai mis en place un codepen qui montre ce comportement à Test Case for AJAX fail

J'ai compris ce que l'erreur fait référence, mais je ne comprends pas pourquoi il ne se produit quand il y a un seul élément dans les données JSON .

Des suggestions?

Répondre

0

Il me semble que lors du retour de plusieurs articles data.query.results.item est traités comme un tableau, mais quand il n'en renvoie qu'un, il est traité comme un objet.

Cela signifie que $ .each lit tous les attributs de l'élément individuel. Une façon de résoudre ce problème serait de traiter différemment les résultats individuels.

if (data.query.count > 0) { 
    $.each(data.query.results.item, function(i, book) { 
    var $title = book.title; 
    var $url = book.link; 
    var $description = book.description; 
    var $isbn = book.guid.content.split(' ', 1); 
)}; 
}else if(data.query.count===1){ 
    var $title = data.query.results.item.title; 
    var $url = data.query.results.item.link; 
    var $description = data.query.results.item.description; 
    var $isbn = data.query.results.item.guid.content.split(' ', 1); 
} 
+0

Merci @Magnus. Cela a fait l'affaire. J'ai raté la différence de notation de tableau dans deux résultats de jason. J'ai dû réorganiser mon code mais je l'ai fonctionné maintenant à [link] (http://codepen.io/boycetrus/pen/gambeB?editors=001) –

0

Avez-vous essayé de le déboguer? http://prntscr.com/8mh030

Je pense que vous manquez le debth de la production et la nécessité de changer
$.each(data.query.results.item, function(i, book)
à
$.each(data.query.results, function(i, book)