在JQuery中将HTML行转换为名称-值对

在JQuery中将HTML行转换为名称-值对,jquery,html,Jquery,Html,我正在尝试使用Jquery将HTML表转换为JSON格式的名称-值对 <table class="table"> <thead class="thead-light"> <tr> <th>MobileNumber</th> <th>Amount</th> <

我正在尝试使用Jquery将HTML表转换为JSON格式的名称-值对

 <table class="table">
        <thead class="thead-light">
           <tr>
                  <th>MobileNumber</th>
                   <th>Amount</th>
                   <th>Fuel</th>
            </tr>
          </thead>
          <tbody>
              <tr>
                  <td>1223445</td>
                  <td>12.49</td>
                  <td>1223</td>
              </tr>
              <tr>
                  <td>99999</td>
                  <td>11.39</td>
                  <td>1277745</td> 
              </tr>
          </tbody>
      </table>
我正试图从()修改此函数,但无法正确执行

  var result = $('myTable tbody').children().map(function () {
               var children = $(this).children();
                return {
                    name: children.eq(0).text(),
                    value: children.eq(1).text()
                };
               }).get();
有人想到将HTML表转换为上述JSON格式吗


-Alan-

您也可以从
元素中选择列名,并通过列索引进行匹配。我还修复了你的“TemplateFields”打字错误,应该是“TemplateFields”。(缺少“l”)

var colNames=$('.table thead th').get().map(el=>el.textContent);
var result=$('.table tbody').children().map(函数(){
var children=$(this.children().get();
var resultObj={Customer:{},TemplateFields:[]};
children.forEach((单元格,索引)=>{
如果(索引==0){
resultObj['Customer'][colNames[index]]=cell.innerText;
}否则{
resultObj['TemplateFields'].push({
名称:colNames[索引],
值:cell.innerText
});
}
});
返回结果j;
}).get();
控制台日志(结果)

移动电话
数量
燃料
1223445
12.49
1223
99999
11.39
1277745

首先,循环通过
thead
获取名称属性:

var cols = $("table>thead>tr>th").map(function() {
  return $(this).text()
});
然后循环遍历每一行
$('table>tbody>tr')
创建一个要添加到结果数组中的条目,并在每一行中,循环遍历除第一行以外的每个单元格以生成名称/值对

var cols=$(“表>thead>tr>th”).map(函数(){
返回$(this.text())
});
var结果=[];
$('table>tbody>tr')。每个(函数(){
var cells=$(this.find(“td”);
变量行={
客户:{MobileNumber:cells.first().text()},
模板场:[]
};
单元。每个单元(功能(即,e){
如果(i==0)返回;//跳过第一列
row.TemplateFieds.push({
“名称”:cols[i],
“值”:$(this).text()
})
});
结果:推动(世界其他地区);
});
控制台日志(结果)

移动电话
数量
燃料
1223445
12.49
1223
99999
11.39
1277745
给您:

let tab = document.getElementById("tab");
let names = tab.querySelectorAll("th");
let values = tab.querySelector("tbody").children;

let arr = [];

for(let i =0; i < values.length;i++){
  let obj = {};
  for(let j = 0;j < names.length;j++){
    obj[names[j].innerHTML] = values[i].children[j].innerHTML;
  }
  arr.push(obj);
}

console.log(JSON.stringify(arr));
let tab=document.getElementById(“tab”);
让name=tab.queryselectoral(“th”);
让value=tab.querySelector(“tbody”).children;
设arr=[];
for(设i=0;i

但这不是一个好的解决方案

决定一列是否应该进入
“Customer”
模板字段的逻辑是什么“
?或者这只是一个任意规则,列不会发生更改?第一列始终转到Customer,其余列应转到TemplateFields,以确定amount/fuel是否为字符串/数字。我已编辑了该问题。所有内容都应该是字符串格式。一些解释可能是一件好事,以确保作者理解您的意图,特别是如果您的建议从长远来看实际上不是一个好的解决方案。
let tab = document.getElementById("tab");
let names = tab.querySelectorAll("th");
let values = tab.querySelector("tbody").children;

let arr = [];

for(let i =0; i < values.length;i++){
  let obj = {};
  for(let j = 0;j < names.length;j++){
    obj[names[j].innerHTML] = values[i].children[j].innerHTML;
  }
  arr.push(obj);
}

console.log(JSON.stringify(arr));