Подтвердить что ты не робот

Создание таблицы HTML из 2D-массива JavaScript

Возможно ли в JavaScript генерировать HTML-таблицу из 2D-массива? Синтаксис для написания HTML-таблиц, как правило, очень многословен, поэтому я хочу сгенерировать HTML-таблицу из 2D-массива JavaScript, как показано ниже:

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

станет:

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

Поэтому я пытаюсь написать функцию JavaScript, которая бы возвращала таблицу из 2D-массива JavaScript, как показано ниже:

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

Ответ 1

Здесь функция, которая будет использовать dom вместо конкатенации строк.

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

Ответ 2

Это довольно легко сделать с циклом double 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;
}

Ответ 3

Другая версия 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;
}

Ответ 4

Версия es6 ответа Дэниела Уильямса:

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

Ответ 5

Посмотрите демонстрацию fiddle, чтобы создать таблицу из массива.

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

Вы можете использовать это так

var tableData = [["r1c1", "r1c2"], ["r2c1", "r2c2"], ["r3c1", "r3c2"]];
createTable(tableData);

Ответ 6

Я знаю, что это старый вопрос, но для тех, кто просматривает такие сети, как я, здесь другое решение:

Используйте replace() в запятых и создайте набор символов, чтобы определить конец строки. Я просто добавляю -- к концу внутренних массивов. Таким образом, вам не нужно запускать функцию for.

Здесь JSFiddle: https://jsfiddle.net/0rpb22pt/2/

Во-первых, вы должны получить таблицу внутри своего HTML и присвоить ей идентификатор:

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

Здесь ваш массив отредактирован для этого метода:

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

Обратите внимание на добавленный -- в конце каждого массива.

Поскольку у вас также есть запятые внутри массивов, вы должны их каким-то образом различать, чтобы не повредить ваш стол, добавив __ после того, как ячейки (кроме последнего в строке) будут работать. Если у вас не было запятых в вашей камере, этот шаг не понадобился бы.

Теперь вот ваша функция:

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

Он работает следующим образом:

  • Позвоните в таблицу и перейдите к настройке innerHTML. document.getElementById("thisTable").innerHTML
  • Начните с добавления тегов HTML, чтобы начать строку и данные. "<tr><td>"
  • Добавьте thisArray в качестве String(). +String(thisArray)
  • Заменить каждый --, который заканчивается перед новой строкой с закрытием и открытием данных и строки. .replace(/--,/g,"</td></tr><tr><td>")
  • Другие запятые означают отдельные данные в строках. Поэтому замените все запятые на закрытие и открытие данных. В этом случае не все запятые находятся между строками, потому что ячейки имеют запятые, поэтому нам пришлось различать те, у которых __: .replace(/__,/g,"</td><td>"). Обычно вы просто делаете .replace(/,/g,"</td><td>").

До тех пор, пока вы не возражаете добавлять в свой массив несколько бродячих символов, он занимает намного меньше кода и прост в реализации.

Ответ 7

Если вы не против jQuery, я использую 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>

Ответ 8

Это holmberd ответ с реализацией "заголовок таблицы"

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 ([["строка 1, ячейка 1", "строка 1, ячейка 2"], ["строка 2, ячейка 1", "строка 2, ячейка 2"], ["строка 3, ячейка 1", "строка 3, ячейка 2 "]]);

Ответ 9

Здесь версия с использованием шаблонных литералов. Он maps данные, создавая новые массивы строк, построенных из литералов шаблона, а затем добавляет их в документ с помощью 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;}

Ответ 10

Вот пример того, как вы можете генерировать и читать данные из матрицы mx n... в JavaScript

let createMatrix = (m, n) => {
      let [row, column] = [[], []],
          rowColumn = m * n
      for (let i = 1; i <= rowColumn; i++) {
        column.push(i)
        if (i % n === 0) {
          row.push(column)
          column = []
        }
      }
      return row
    }

let setColorForEachElement = (matrix, colors) => {
  let row = matrix.map(row => {
    let column = row.map((column, key) => {
      return { number: column, color: colors[key] }
    })
    return column
  })
  return row
} 

const colors = ['red', 'green', 'blue', 'purple', 'brown', 'yellow', 'orange', 'grey']
const matrix = createMatrix(6, 8)
const colorApi = setColorForEachElement(matrix, colors)

let table ='<table>'
colorApi.forEach(row => {
  table+= '<tr>'
    row.forEach(column =>  table += '<td style='background: ${column.color};'>${column.number}<td>' )
  table+='</tr>'
})
table+= '</table>'
document.write(table);

Ответ 11

На основании принятого решения:

function createTable (tableData) {
  const table = document.createElement('table').appendChild(
    tableData.reduce((tbody, rowData) => {
      tbody.appendChild(
        rowData.reduce((tr, cellData) => {
          tr.appendChild(
            document
              .createElement('td')
              .appendChild(document.createTextNode(cellData))
          )
          return tr
        }, document.createElement('tr'))
      )
      return tbody
    }, document.createElement('tbody'))
  )

  document.body.appendChild(table)
}

createTable([
  ['row 1, cell 1', 'row 1, cell 2'],
  ['row 2, cell 1', 'row 2, cell 2']
])

С помощью простого изменения можно вернуть таблицу как элемент HTML.

Ответ 12

Генерация таблицы и поддержка HTML в качестве входных данных.

Вдохновлено @spiny-norman fooobar.com/info/307967/...

И @bornd fooobar.com/info/74326/...

function escapeHtml(unsafe) {
    return String(unsafe)
         .replace(/&/g, "&amp;")
         .replace(/</g, "&lt;")
         .replace(/>/g, "&gt;")
         .replace(/"/g, "&quot;")
         .replace(/'/g, "&#039;");
 }

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++){
            k = escapeHtml((myArray[i][j]));
            result += "<td>"+k+"</td>";
        }
        result += "</tr>";
    }
    result += "</table>";

    return result;
}

Протестируйте здесь с JSFIDDLE - Вставьте прямо из Microsoft Excel, чтобы получить таблицу