Reputation: 2790
I have the following JSON structure (an array that contains arrays where each array holds a dict element) that I receive from a function based view and I want to iterate through all the elements and discard those that are arrays with empty dictionaries.
data.table_values = [[{'id': 1021972,'Aging_Un_investigated_Issue': '0.94',
'User': 'John P.', 'Open_date':'2017-08-04 01:34:18','End_date':'2017-09-05 00:29:01',
'Ticket_status':'Transferred'},{'id': 1036722, 'Aging_Un_investigated_Issue': '0.01',
'User': 'John P.', 'Open_date':'2017-09-01 00:34:18',
'End_date':'', 'Ticket_status':'Researching'},{'id': 1015621,
'Aging_Un_investigated_Issue': '0.11', 'User': 'John D.','Open_date':'2017-01-01 00:00:18',
'End_date':'2017-09-01 20:20:57','Ticket_status':'Closed'}],
[{}],
[{}],
[{'id': 1045971,'Aging_Un_investigated_Issue': '0.23',
'User': 'John C.', 'Open_date':'2016-05-01 02:32:18','End_date':'2017-09-05 12:29:01',
'Ticket_status':'Transferred'},{'id': 1035522, 'Aging_Un_investigated_Issue': '0.02',
'User': 'John C.', 'Open_date':'2015-08-01 00:34:18',
'End_date':'', 'Ticket_status':'Researching'},{'id': 1223621,
'Aging_Un_investigated_Issue': '0.11', 'User': 'John C.','Open_date':'2016-01-01 00:00:18',
'End_date':'2017-09-02 21:20:57','Ticket_status':'Closed'}]]
I know how to iterate through the all values of one array element but I do not know how to iterate through all the values of all the arrays.
//iterate through all the values of one array element
<script>
//select the first list element
//data.table_values is the variable that receives the JSON
var table_values = data.table_values[0]
setTable()
function setTable(){
var tbody = $('#reservations tbody'),
//iterate through the elements of list 0
props = ["id", "User", "Open_date", "Ticket_status", "End_date"];
$.each(table_values, function(i, value) {
var tr = $('<tr>');
$.each(props, function(i, prop) {
$('<td>').html(value[prop]).appendTo(tr);
});
tbody.append(tr);
});
$(document).ready(function(){
$('#reservations').DataTable();
});
}
</script>
<html>
<table id="reservations" style="width:100%">
<thead>
<tr>
<th>ID</th>
<th>User</th>
<th>Open Date</th>
<th>Ticket Status</th>
<th>End Date</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</html>
How can I iterate through all the arrays and discard those that contain arrays with empty dicts?
Feel free to use this JS Fiddle that I prepared, so you can do some tests.
Upvotes: 1
Views: 187
Reputation: 1935
You would like to iterate through the data.table_values array and test each element to see if it is blank - if it is, then skip the iteration.
var data = {}; // Assuming that you have data declared before -
// I just need this one here to make the snippet work
data.table_values = [
[{
'id': 1021972,
'Aging_Un_investigated_Issue': '0.94',
'User': 'John P.',
'Open_date': '2017-08-04 01:34:18',
'End_date': '2017-09-05 00:29:01',
'Ticket_status': 'Transferred'
}, {
'id': 1036722,
'Aging_Un_investigated_Issue': '0.01',
'User': 'John P.',
'Open_date': '2017-09-01 00:34:18',
'End_date': '',
'Ticket_status': 'Researching'
}, {
'id': 1015621,
'Aging_Un_investigated_Issue': '0.11',
'User': 'John D.',
'Open_date': '2017-01-01 00:00:18',
'End_date': '2017-09-01 20:20:57',
'Ticket_status': 'Closed'
}], [{}], [{}], [{
'id': 1045971,
'Aging_Un_investigated_Issue': '0.23',
'User': 'John C.',
'Open_date': '2016-05-01 02:32:18',
'End_date': '2017-09-05 12:29:01',
'Ticket_status': 'Transferred'
}, {
'id': 1035522,
'Aging_Un_investigated_Issue': '0.02',
'User': 'John C.',
'Open_date': '2015-08-01 00:34:18',
'End_date': '',
'Ticket_status': 'Researching'
}, {
'id': 1223621,
'Aging_Un_investigated_Issue': '0.11',
'User': 'John C.',
'Open_date': '2016-01-01 00:00:18',
'End_date': '2017-09-02 21:20:57',
'Ticket_status': 'Closed'
}]
];
for(table_values of data.table_values) {
if( table_values.length == 0 ) continue;
setTable();
}
function setTable(){
var tbody = $('#reservations').find('tbody'),
//iterate through the elements of list 0
props = ["id", "User", "Open_date", "Ticket_status", "End_date"];
$.each(table_values, function(i, value) {
var tr = $('<tr>');
$.each(props, function(i, prop) {
$('<td>').html(value[prop]).appendTo(tr);
});
tbody.append(tr);
});
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="reservations" style="width:100%">
<thead>
<tr>
<th>ID</th>
<th>User</th>
<th>Open Date</th>
<th>Ticket Status</th>
<th>End Date</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
Upvotes: 1
Reputation: 106
I have modified your fiddle by adding a map
and filter
statement to accomplish 1 and 2: http://jsfiddle.net/8a6858b6/1/
Is flattening a sufficient strategy, or are you trying to preserve the Array structure of your table data?
Upvotes: 1