{
"entries": [
{
"id": 23931763,
"url": "http://www.dailymile.com/entries/23931763",
"at": "2013-07-15T21:05:39Z",
"message": "I ran 3 miles and walked 2 miles today.",
"comments": [],
"likes": [],
"user": {
"username": "DeanaLaughli",
"display_name": "Deana O.",
"photo_url": "http://s3.dmimg.com/pictures/users/361413/1329826045_avatar.jpg",
"url": "http://www.dailymile.com/people/DeanaLaughli"
},
"workout": {
"activity_type": "Fitness",
"distance": {
"value": 5,
"units": "miles"
},
"felt": "great"
}
},
{
"id": 23931680,
"url": "http://www.dailymile.com/entries/23931680",
"at": "2013-07-15T21:01:03Z",
"message": "More strength training",
"comments": [],
"likes": [],
"location": {
"name": "MA"
},
"user": {
"username": "Ecm2571",
"display_name": "Eileen",
"photo_url": "http://s3.dmimg.com/pictures/users/323833/1368556483_avatar.jpg",
"url": "http://www.dailymile.com/people/Ecm2571"
},
"workout": {
"activity_type": "Weights",
"title": "Upper and lower body "
}
}
]
}
Here is an example of a JSON array that I am getting via JSONP request from a URL. I am trying to display:
- photo_url
- username
- message
- location.name
- workout.activity_type
- workout.duration
- workout.distance.value
- workout.distance.units
However, as you can see in the array sometimes this information isn't given and when this happens the code stops loading more entries. I need a way to display a blank space when there is no data to load. Here is my code, thanks for any help.
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"> </script>
<script>
$(function() {
var entries = [];
var workout.activity
var dmJSON = "http://api.dailymile.com/entries.json?callback=?";
$.getJSON( dmJSON, function(data) {
$.each(data.entries, function(i, f) {
var tblRow = "<tr>" +
"<td><img src=" + f.user.photo_url + "></td>" +
"<td>" + f.user.username + "</td>" +
"<td>" + f.message + "</td>" +
//"<td>" + f.location.name + "</td>" +
"<td>" + f.workout.activity_type + "</td>" +
"<td>" + f.workout.duration + "</td>" +
"<td>" + f.workout.distance.value + f.workout.distance.units + "</td>" +
"</tr>"
$(tblRow).appendTo("#entrydata tbody");
});
});
});
</script>
</head>
<body>
<div class="wrapper">
<div class="profile">
<table id= "entrydata" border="1">
<thead>
<th></th>
<th>Username</th>
<th>Message</th>
<th>Exercise Type</th>
<th>Duration</th>
<th>Distance</th>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</body>
</html>
f.workout.distance
is undefined (because it is in the 2nd response). Read the error console to first determine what is wrong. Establish guards or sentinels or use a "path evaluator". – user2246674 Jul 15 '13 at 22:09f.workout.distance ? f.workout.distance.value + f.workout.distance.units : ""
- but for anything non-trivial this is better written taking the larger context into account (e.g. don't show last td?). – user2246674 Jul 15 '13 at 22:12{..}
delineates a JSON/JS object, not an array). And yes, you could do that too. For instance, at the top of the each/generation function:f.workout.distance ||= { value: '', units: 'Not applicable' }
; however, consider if this is appropriate here or makes future refactoring harder. I would actually suggest to change the HTML-string generation to an incremental builder (i.e. build each TD one at a time) or template with basic conditional support. This would allow using an "if" around the offending region to customize the result better. – user2246674 Jul 15 '13 at 22:29