2013-03-01 15 views
20

Czy w JavaScript możliwe jest wygenerowanie tabeli HTML z tablicy 2D? Składnia do pisania tabel HTML wydaje się być bardzo gadatliwy, więc chcę, aby wygenerować tabelę HTML z tablicy 2D JavaScript, jak pokazano:Generowanie tabeli HTML z dwuwymiarowej tablicy JavaScript

[["row 1, cell 1", "row 1, cell 2"], 
["row 2, cell 1", "row 2, cell 2"]] 

staną:

<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> 

więc jestem starając się napisać funkcję JavaScript, która zwróci tablicę z tablicy 2D JavaScript, jak pokazano:

function getTable(array){ 
    //take a 2D JavaScript string array as input, and return an HTML table. 
} 
+3

Dziwię się, że nikt inny nie zwrócił na to pytanie wcześniej. Pomyślałem, że będzie to coś, czego większość twórców stron będzie potrzebować. –

+0

Więc czekaj, zadałeś pytanie, napisałeś komentarz, a następnie wysłałeś odpowiedź na swoje własne pytanie w ciągu 6 minut? Dlaczego potrzebujesz nawet przepełnienia stosu, możesz to zrobić za pomocą dokumentu tekstowego. – VoronoiPotato

+11

@VoronoiPotato Wysłałem odpowiedź na moje własne pytanie, aby odpowiedź była przydatna dla innych twórców stron internetowych - do tego służy właśnie Stack Overflow. Istnieje nawet przycisk "odpowiedz na własne pytanie", który jest wyświetlany podczas publikowania pytania w Stack Exchange Network. –

Odpowiedz

31

Oto funkcja, która użyje dom zamiast konkatenacji ciągów.

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"]]); 
+0

To działa, ale jest bardziej gadatliwy niż inne odpowiedzi, które znalazłem. –

+1

Dom jest verbose, ale bezpieczniejszy niż innerHTML. – bmavity

+0

Wygląda na to, że twoje rozwiązanie generuje akapit tekstu zamiast generowania tabeli: http://jsfiddle.net/jCVmZ/ –

21

jest to dość łatwe do czynienia z podwójnym pętli for.

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; 
} 
+0

To jest najlepsza odpowiedź. –

+2

To nie radzi sobie z ciągami zawierającymi '<' lub '&'. – trincot

3

Kolejna wersja bez wersji wewnętrznej.

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; 
} 
+0

Czym różni się to od zaakceptowanej odpowiedzi? – gvlasov

+0

Czy istnieje lepszy sposób niż zagnieżdżona pętla? – Magondu

0

wiem, jest to stara sprawa, ale dla tych, przeglądania stron internetowych, jak ja, tutaj jest inne rozwiązanie:

Zastosowanie replace() na przecinki i stworzyć zestaw znaków do określenia końca wiersza . Dodaję tylko -- do końca wewnętrznych tablic. W ten sposób nie trzeba uruchamiać funkcji for.

Oto JSFiddle: https://jsfiddle.net/0rpb22pt/2/

Po pierwsze, trzeba się dostać stolik wewnątrz kodu HTML i nadać mu ID:

<table id="thisTable"><tr><td>Click me</td></tr></table> 

Oto Twoja tablica edytowana dla tej metody:

thisArray=[["row 1, cell 1__", "row 2, cell 2--"], ["row 2, cell 1__", "row 2, cell 2"]]; 

Zauważ dodany -- na końcu każdej tablicy.

Ponieważ masz również przecinkami wewnątrz tablic, trzeba odróżnić je jakoś tak nie skończyć brudząc swój Tabeli-dodanie __ po komórek (poza ostatnim w rzędzie) działa. Jeśli nie masz przecinków w komórce, ten krok nie będzie konieczny.

Teraz tutaj jest twoja funkcja:

function tryit(){ 
    document 
    .getElementById("thisTable") 
    .innerHTML="<tr><td>"+String(thisArray) 
    .replace(/--,/g,"</td></tr><tr><td>") 
    .replace(/__,/g,"</td><td>"); 
} 

To działa tak:

  1. Zadzwoń do swojego stolika i dostać się do ustawiania innerHTML. document.getElementById("thisTable").innerHTML
  2. Rozpocznij od dodania znaczników HTML, aby rozpocząć wiersz i dane. "<tr><td>"
  3. Dodaj thisArray jako String(). +String(thisArray)
  4. Wymień co --, który kończy się przed nowym wierszem z zamknięciem i otwarciem danych i wiersza..replace(/--,/g,"</td></tr><tr><td>")
  5. Pozostałe przecinki oznaczają oddzielne dane w ciągu wierszy. Zastąp wszystkie przecinki zamknięciem i otwarciem danych. W tym przypadku nie są przecinane między wierszami, ponieważ komórki mają przecinki, więc musieliśmy rozróżnić je z __: .replace(/__,/g,"</td><td>"). Zwykle po prostu robisz .replace(/,/g,"</td><td>").

Dopóki nie masz nic przeciwko dodawaniu do twojej tablicy niektórych zabłąkanych znaków, zajmuje to znacznie mniej kodu i jest proste w implementacji.

0

Jeśli nie przeszkadza jQuery, używam 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> 
3

wersja ES6 odpowiedzi Daniela Williamsa:

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'); 
    } 
0

szybkie i łatwe.

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); 
} 

https://jsfiddle.net/6urdwdtf/1/

Powiązane problemy