我正在尝试使用jquery从html表中获取json对象的数组。该表和数据将在运行时确定并保存不同的数据。 所以我想从thead td获取json对象的属性,从tbody td获取值。
<table id="myTable">
<thead>
<tr>
<td>Name</td>
<td>Gender</td>
</tr>
</thead>
<tbody>
<tr>
<td>Mary Jane</td>
<td>Female</td>
</tr>
<tr>
<td>Peter Parker</td>
<td>Male</td>
</tr>
</tbody>
</table>
我能够创建json对象的数组,但是我必须编写硬编码的属性。
var jsonList = [{"Name":"Mary Jane", "Gender":"Female"},{"Name":"Peter Parker", "Gender":"Male"}]
我的代码:
var data = [];
var target = $('#myTable tr').not('thead tr');
target.each(function (i) {
console.log($(this).find('td:eq(0)').html());
data.push({
"Name": $(this).find('td:eq(0)').html(),
"Gender": $(this).find('td:eq(1)').html()
});
});
var json =JSON.stringify(data);
如何使用jquery做到这一点?
答案 0 :(得分:2)
您可以先从数组中的thead
获取单元格,然后循环tbody
中的每一行,然后使用单元格索引从具有相同索引的主题中获取属性名称。
let th = $("#myTable thead tr td").map(function() {
return $(this).text()
}).get();
let data = $("#myTable tbody tr").map(function() {
return Array.from($(this).find("td")).reduce(function(r, td, i) {
r[th[i]] = td.textContent;
return r;
}, {})
}).get()
console.log(data)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="myTable">
<thead>
<tr>
<td>Name</td>
<td>Gender</td>
</tr>
</thead>
<tbody>
<tr>
<td>Mary Jane</td>
<td>Female</td>
</tr>
<tr>
<td>Peter Parker</td>
<td>Male</td>
</tr>
</tbody>
</table>
答案 1 :(得分:1)
var headers = $('#myTable thead tr:eq(0)').find('td, th').map(function () {
return $(this).text();
}).get();
var data = $('#myTable tbody tr').map(function () {
return Array.from($(this).find('td')).reduce(function (accumulator, current, index) {
accumulator[headers[index]] = $(current).text();
return accumulator;
}, {});
}).get();
var json = JSON.stringify(data);
console.log(json);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="myTable">
<thead>
<tr>
<td>Name</td>
<td>Gender</td>
</tr>
</thead>
<tbody>
<tr>
<td>Mary Jane</td>
<td>Female</td>
</tr>
<tr>
<td>Peter Parker</td>
<td>Male</td>
</tr>
</tbody>
</table>
答案 2 :(得分:0)
你去了
var a = $(`<table id="myTable">
<thead>
<tr>
<td>Name</td>
<td>Gender</td>
</tr>
</thead>
<tbody>
<tr>
<td>Mary Jane</td>
<td>Female</td>
</tr>
<tr>
<td>Peter Parker</td>
<td>Male</td>
</tr>
</tbody>
</table>`);
var keys = a
.find("thead tr td")
.toArray()
.map(x => x.textContent);
var result = a
.find("tbody tr")
.map((i, tr) => {
var obj = {};
$(tr)
.find("td")
.each((i, td) => (obj[keys[i]] = td.innerText));
return obj;
})
.toArray();
console.log(result);
答案 3 :(得分:0)
如果您能够编辑HTML,则可以做一些事情来简化此操作:
首先,我将 thead 中的 td 更改为 th 。这将有助于JavaScript,并且在语义上也更好。
var data = [];
var $myTable = $('#myTable'); //keeping the table in memory is a bit more effcient
var labels = $myTable.find('thead th').toArray().map(function(th) { //toArray converts the jQuery object to a standard JavaScript array so that we can use the native .map method.
return th.innerHTML.trim(); //innerHTML is like jQuery .text(), .trim() removes any whitespace on the left or right.
}); //["Name","Gender"]
var $rows = $myTable.find('tbody tr');
$rows.each(function() {
var $row = $(this);
var row_data = {};
for (let i = 0; i < labels.length; i++) { //native JS for loop
row_data[labels[i]] = $row.find('td:eq(' + i + ')').text().trim();
}
data.push(row_data);
});
console.log(data);
var json_data = JSON.stringify(data); //array of objects in string format
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="myTable">
<thead>
<tr>
<th>Name</th>
<th>Gender</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mary Jane</td>
<td>Female</td>
</tr>
<tr>
<td>Peter Parker</td>
<td>Male</td>
</tr>
</tbody>
</table>
那么JavaScript到底是怎么回事?首先,我将表作为$ myTable保留在内存中,并从那里查找我们需要的元素。为了找到标签,我使用jQuery .toArray()将jQuery对象转换为普通JavaScript数组,以便我们可以使用.map()。 Map是一种非常有用的方法,因为您从回调返回的所有内容都会被推送到我称为标签的新数组上。
接下来,我们从$ myTable获取所有行,并像您一样在它们上循环。我没有对对象键进行硬编码,而是遍历了我们之前制作的标签数组。我还使用临时变量 i 查找所需的td。最后将构造的对象推到数组的末尾。
请注意!:页面上有损坏的HTML,或者一行缺少一些数据,您的数据也会出现问题。如果您能够编辑HTML,但需要JavaScript中的数据,则建议使用application / json标记,如下所示:
var $myData = $('#myData');
var json_data = $myData.text(); //if you just need string data, stop here!
console.log(json_data);
var data = JSON.parse(json_data);
console.log(data);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script id="myData" type="application/json">
[{
"Name": "Mary Jane",
"Gender": "Female"
}, {
"Name": "Peter Parker",
"Gender": "Male"
}]
</script>
我希望这会有所帮助:)