J'essaie de convertir une table HTML en paire nom-valeur au format JSON à l'aide de Jquery.
var result = $('myTable tbody').children().map(function () {
var children = $(this).children();
return {
name: children.eq(0).text(),
value: children.eq(1).text()
};
}).get();
Le tableau ci-dessus doit être converti en une paire nom-valeur au format JSON comme ci-dessous p>
[{
"Customer":{
"MobileNumber":"1223445"
},
"TemplateFieds": [{
"Name": "Amount",
"value": "12.49"
},
{
"Name":"Fuel",
"value": "1223"
}]
},
{
"Customer":{
"MobileNumber":"99999"
},
"TemplateFieds": [{
"Name": "Amount",
"value": "11.39"
},
{
"Name":"Fuel",
"value": "1277745"
}]
}]
J'essaye de modifier cette fonction depuis ( récupère les valeurs de la table sous forme de paires clé-valeur avec jquery ) mais je ne peux pas faire les choses correctement.
<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>
Tout le monde a une idée convertir le tableau HTML au format JSON mentionné ci-dessus?
-Alan-
3 Réponses :
Vous pouvez simplement sélectionner les noms de colonnes à partir des éléments et les faire correspondre via l'index de colonne. J'ai également corrigé votre faute de frappe "TemplateFieds", qui devrait être "TemplateFields". ("l" manquant) <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<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 colNames = $('.table thead th').get().map(el => el.textContent);
var result = $('.table tbody').children().map(function() {
var children = $(this).children().get();
var resultObj = {Customer: {}, TemplateFields: []};
children.forEach((cell, index) => {
if (index === 0) {
resultObj['Customer'][colNames[index]] = cell.innerText;
} else {
resultObj['TemplateFields'].push({
name: colNames[index],
value: cell.innerText
});
}
});
return resultObj;
}).get();
console.log(result);
Tout d'abord, parcourez la thead pour obtenir les propriétés du nom:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<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> puis parcourez chaque ligne $ ('table> tbody> tr' ) en créant une entrée à ajouter à votre tableau de résultats et dans chaque ligne, parcourez chaque cellule sauf la première pour générer la paire nom / valeur.
var cols = $("table>thead>tr>th").map(function() {
return $(this).text()
});
var result = [];
$('table>tbody>tr').each(function() {
var cells = $(this).find("td");
var row = {
Customer: { MobileNumber: cells.first().text() },
TemplateFieds: []
};
cells.each(function(i, e) {
if (i == 0) return; // skip first col
row.TemplateFieds.push({
"Name": cols[i],
"value": $(this).text()
})
});
result.push(row);
});
console.log(result);
var cols = $("table>thead>tr>th").map(function() {
return $(this).text()
});
Quelques notes:
vous voilà:
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));
mais ce n'est pas une bonne solution
Certaines explications peuvent être une bonne chose, pour s'assurer que l'auteur comprend votre intention, surtout si votre suggestion n'est pas vraiment une bonne solution à long terme.
Quelle est la logique pour décider si une colonne doit entrer dans
"Customer"ouTemplateFields "? Ou est-ce simplement une règle arbitraire et les colonnes ne seront pas sujettes à modification?La première colonne va toujours à Customer et le reste de la colonne doit aller à TemplateFields
Comme ci-dessus pour décider si quantité / carburant est une chaîne / un nombre.
J'ai édité la question. Tout doit être au format chaîne