En JavaScript, est-il possible de générer un tableau HTML à partir d'un tableau 2D? La syntaxe utilisée pour écrire des tableaux HTML a tendance à être très détaillée. Je souhaite donc générer un tableau HTML à partir d'un tableau JavaScript 2D, comme indiqué:
[["row 1, cell 1", "row 1, cell 2"],
["row 2, cell 1", "row 2, cell 2"]]
deviendrait:
<table border="1">
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>
J'essaie donc d'écrire une fonction JavaScript qui renverrait une table à partir d'un tableau JavaScript 2D, comme indiqué:
function getTable(array){
//take a 2D JavaScript string array as input, and return an HTML table.
}
Voici une fonction qui utilisera le dom au lieu de la concaténation de chaînes.
function createTable(tableData) {
var table = document.createElement('table');
var tableBody = document.createElement('tbody');
tableData.forEach(function(rowData) {
var row = document.createElement('tr');
rowData.forEach(function(cellData) {
var cell = document.createElement('td');
cell.appendChild(document.createTextNode(cellData));
row.appendChild(cell);
});
tableBody.appendChild(row);
});
table.appendChild(tableBody);
document.body.appendChild(table);
}
createTable([["row 1, cell 1", "row 1, cell 2"], ["row 2, cell 1", "row 2, cell 2"]]);
C'est assez facile à faire avec un double pour la boucle.
function makeTableHTML(myArray) {
var result = "<table border=1>";
for(var i=0; i<myArray.length; i++) {
result += "<tr>";
for(var j=0; j<myArray[i].length; j++){
result += "<td>"+myArray[i][j]+"</td>";
}
result += "</tr>";
}
result += "</table>";
return result;
}
Une version es6 de la réponse de Daniel Williams:
function get_table(data) {
let result = ['<table border=1>'];
for(let row of data) {
result.Push('<tr>');
for(let cell of row){
result.Push(`<td>${cell}</td>`);
}
result.Push('</tr>');
}
result.Push('</table>');
return result.join('\n');
}
Une autre version de innerHTML.
function makeTable(array) {
var table = document.createElement('table');
for (var i = 0; i < array.length; i++) {
var row = document.createElement('tr');
for (var j = 0; j < array[i].length; j++) {
var cell = document.createElement('td');
cell.textContent = array[i][j];
row.appendChild(cell);
}
table.appendChild(row);
}
return table;
}
Voir la démo fiddle pour créer une table à partir d’un tableau .
function createTable(tableData) {
var table = document.createElement('table');
var row = {};
var cell = {};
tableData.forEach(function(rowData) {
row = table.insertRow(-1); // [-1] for last position in Safari
rowData.forEach(function(cellData) {
cell = row.insertCell();
cell.textContent = cellData;
});
});
document.body.appendChild(table);
}
Vous pouvez l'utiliser comme ça
var tableData = [["r1c1", "r1c2"], ["r2c1", "r2c2"], ["r3c1", "r3c2"]];
createTable(tableData);
Voici une version utilisant template literals . Il maps
sur les données créant de nouveaux tableaux de chaînes construits à partir des littéraux de modèle, puis les ajoute au document avec insertAdjacentHTML
:
let data = [
['Title', 'Artist', 'Duration', 'Created'],
['hello', 'me', '2', '2019'],
['ola', 'me', '3', '2018'],
['Bob', 'them', '4.3', '2006']
];
function getCells(data, type) {
return data.map(cell => `<${type}>${cell}</${type}>`).join('');
}
function createBody(data) {
return data.map(row => `<tr>${getCells(row, 'td')}</tr>`).join('');
}
function createTable(data) {
const [headings, ...rows] = data;
return `
<table>
<thead>${getCells(headings, 'th')}</thead>
<tbody>${createBody(rows)}</tbody>
</table>
`;
}
document.body.insertAdjacentHTML('beforeend', createTable(data));
table { border-collapse: collapse; }
tr { border: 1px solid #dfdfdf; }
th, td { padding: 2px 5px 2px 5px;}
Si cela ne vous dérange pas jQuery, j'utilise this :
<table id="metaConfigTable">
<caption>This is your target table</caption>
<tr>
<th>Key</th>
<th>Value</th>
</tr>
</table>
<script>
function tabelajzing(a){
// takes (key, value) pairs from and array and returns
// corresponding html, i.e. [ [1,2], [3,4], [5,6] ]
return [
"<tr>\n<th>",
a.map(function (e, i) {
return e.join("</th>\n<td>")
}).join("</td></tr>\n<tr>\n<th>"),
"</td>\n</tr>\n"
].join("")
}
$('#metaConfigTable').find("tr").after(
tabelajzing( [ [1,2],[3,4],[5,6] ])
);
</script>
C'est holmberd answer avec une implémentation "table header"
function createTable(tableData) {
var table = document.createElement('table');
var header = document.createElement("tr");
// get first row to be header
var headers = tableData[0];
// create table header
headers.forEach(function(rowHeader){
var th = document.createElement("th");
th.appendChild(document.createTextNode(rowHeader));
header.appendChild(th);
});
console.log(headers);
// insert table header
table.append(header);
var row = {};
var cell = {};
// remove first how - header
tableData.shift();
tableData.forEach(function(rowData, index) {
row = table.insertRow();
console.log("indice: " + index);
rowData.forEach(function(cellData) {
cell = row.insertCell();
cell.textContent = cellData;
});
});
document.body.appendChild(table);
}
createTable ([["" ligne 1, cellule 1 "," ligne 1, cellule 2 "], [" ligne 2, cellule 1 "," ligne 2, cellule 2 "], [" ligne 3, cellule 1 "," ligne 3, cellule 2 "]]);