Anyone know how to convert an HTML table of values into a nice JSON object to be manipulated with jQuery?
-
1What do you mean by "table"? Database table? HTML table?Sampson– Sampson2010-02-10 20:13:05 +00:00Commented Feb 10, 2010 at 20:13
-
possible duplicate of Iterate through html table using jQuery, converting the data in the table into JSONRoger Pate– Roger Pate2010-06-09 01:03:45 +00:00Commented Jun 9, 2010 at 1:03
3 Answers
An HTML table? Like, all the <td> contents in a 2-d array?
var tbl = $('table#whatever tr').map(function() {
return $(this).find('td').map(function() {
return $(this).html();
}).get();
}).get();
Then just use $.json (or whatever library you want) to turn that into a JSON string.
edit — re-written to use the native (shim here) .map() from the array prototype:
var tbl = $('table#whatever tr').get().map(function(row) {
return $(row).find('td').get().map(function(cell) {
return $(cell).html();
});
});
The jQuery .map() function has the "feature" of flattening returned arrays into the result array. That is, if the callback function returns a value that is itself an array, then instead of that returned array becoming the value of one cell of the .map() result, its elements are each added to the result.
It might work to use the original jQuery version and just wrap an extra array around the returned values.
3 Comments
.map() method has the (quite questionable, if you ask me) feature of flattening returned arrays. This basic approach would work however with the native .map() that newer JavaScript environments provide via the Array prototype.Do you mean the following situation?
Given:
A1 B1 C1 ...
A2 B2 C2 ...
...
Needed:
{"1": ["A1", "B1", "C1", ...],
"2": ["A2", "B2", "C2", ...], ...}
So use the following function which creates a valid JSON-String function without trailing ",":
function html2json() {
var json = '{';
var otArr = [];
var tbl2 = $('#dest_table tr').each(function(i) {
x = $(this).children();
var itArr = [];
x.each(function() {
itArr.push('"' + $(this).text() + '"');
});
otArr.push('"' + i + '": [' + itArr.join(',') + ']');
})
json += otArr.join(",") + '}'
return json;
}
I needed the same thing except with the ability to ignore columns, override values, and not be confused by nested tables. I ended up writing a jQuery plugin table-to-json:
https://github.com/lightswitch05/table-to-json
All you have to do is select your table using jQuery and call the plugin:
var table = $('#example-table').tableToJSON();
Here is a demo of it in action:
$('#run').click(function() {
var table = $('#example-table').tableToJSON();
console.log('Table:', table);
alert(JSON.stringify(table, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lib/jquery.tabletojson.min.js"></script>
<table id='example-table'>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th data-override="Score">Points</th>
</tr>
</thead>
<tbody>
<tr>
<td>Jill</td>
<td>Smith</td>
<td data-override="disqualified">50</td>
</tr>
<tr>
<td>Eve</td>
<td>Jackson</td>
<td>94</td>
</tr>
<tr>
<td>John</td>
<td>Doe</td>
<td>80</td>
</tr>
<tr>
<td>Adam</td>
<td>Johnson</td>
<td>67</td>
</tr>
</tbody>
</table>
<button id="run">Convert!</button>
6 Comments
allowHTML to preserve HTML tags