Как я могу создать таблицу HTML, используя массивы (vanilla JS)? - PullRequest
1 голос
/ 23 июня 2019

У меня есть два массива:

let arr1 = ['lion', 'tiger', 'elephant', 'snake', 'bear'];
let arr2 = ['mane', 'stripes', 'trunk', 'slither', 'claws'];

В настоящее время я делаю что-то вроде этого:

var html = '<table id="timetable">';
    for (let i=0; i < arr1.length; i++) {
        html +='<td>' + arr1[i] + '</td>';  
    }
    html += '<tr/>';
    for (let i=0; i < arr2.length; i++) {
        html += '<td class="text-centre">'+ arr2[arr1[i].toLowerCase()]+ '</td>';   
    }
    html += '</table>';

Списки всегда будут иметь одинаковый размер , но я не могу создать желаемую структуру таблицы, используя только один для цикла. Любая помощь?

<table>
   <tr> 
   <td> lion </td>
   <td> tiger </td> 
   <td> elephant </td>
   <td> snake </td> 
   <td> bear </td>
 </tr>
 <tr>
   <td> mane </td>
   <td> stripes </td> 
   <td> trunk </td>
   <td> slither </td> 
   <td> claws </td>
 </tr>
</table>

Ответы [ 3 ]

0 голосов
/ 23 июня 2019

может быть этот должен быть более понятным?

let arr1 = ['lion', 'tiger', 'elephant', 'snake', 'bear'] 
let arr2 = ['mane', 'stripes', 'trunk', 'slither', 'claws'] 

createTimeTable( arr1, arr2 )

function createTimeTable()
{
  let TimeTable = document.createElement('table')
  TimeTable.id = 'timetable'

  document.body.appendChild(TimeTable)

  for (arr of arguments) {
    let row = TimeTable.insertRow(-1)
    let c = 0
    for(cell of arr) row.insertCell(c++).textContent = cell
  }
}
table { border-collapse: collapse}
td    { border: 1px solid grey; padding: .2em .8em }
0 голосов
/ 23 июня 2019
Цикл

A for - это блок кода, который содержит 3 оператора: первый инициализирует цикл для использования, второй оценивает условие, которое должно быть выражено перед каждой итерацией цикла, а третий оператор выполняется до тех пор, пока второй условие оценивается как true.

Все 3 оператора являются необязательными, если вы добавите точку с запятой, чтобы дать интерпретатору Javascript знать, что определяющая логика для цикла for находится в другом месте кода.

Таким образом, технически вы можете создать цикл for, в котором все три оператора опущены следующим образом:

var i = 0;

for (;;) { 
    if (i > 3) { break; } console.log(i);
    i++;
}

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

При программном создании таблицы действительно является стандартной практикой использование вложенных for циклов, повторяющих вложенные массивы (иначе называемые многомерными массивами ), и на самом деле нет причин, по которым вы не должны:

// Create a nested array. Access individual values like multi[...][...]
var multi = [ 
    ['lion', 'tiger', 'elephant', 'snake', 'bear'], 
    ['mane', 'stripes', 'trunk', 'slither', 'claws']
];
var arr1 = multi[0], arr2 = multi[1];

var table = '<table id = "timetable">';

for (var i = 0; i < multi.length; i++) {
    table += '<tr>';
    for (var j = 0; j < multi[i].length; j++) {
      table += '<td class = "text-centre">' + multi[i][j] + '</td>';
    }
    table += '</tr>';
}
table += '</table>';
document.body.innerHTML = table;

Но, если вы действительно действительно хотите, вы можете сделать это следующим образом, используя только один цикл for:

// as you can see, this is way more convoluted and prone to error

// Create a nested array. Access individual values like multi[...][...]
var multi = [ 
    ['lion', 'tiger', 'elephant', 'snake', 'bear'], 
    ['mane', 'stripes', 'trunk', 'slither', 'claws']
];
var table = '<table id = "timetable">';

for (var j = 0, k = 0; j < multi.length; ) { // third statement omitted. will run until j = 2.

    // add a tr at the beginning and end of the table row
    if (k === 0) { table += '<tr>' }

    table += '<td class = "text-centre">' + multi[j][k] + '</td>';

    if (k === (multi[j].length-1)) { 
        k = 0; // reset k to zero for iteration
        table += '</tr>';
        j++; // increment j;
    } else {
        k++;
    }
}
table += '</table>';
document.body.innerHTML = table;

For петли: здесь и здесь .

P.S., вам на самом деле не нужно создавать атрибут класса для каждого элемента <td>. Вы можете использовать селектор потомков CSS 2.1. Это будет соответствовать каждому td элементу, вложенному в #timetable, независимо от того, насколько глубоко: #timetable td { text-align: center; }

0 голосов
/ 23 июня 2019

Вы можете сделать это вообще без петель:

let arr1 = ['lion', 'tiger', 'elephant', 'snake', 'bear'];
let arr2 = ['mane', 'stripes', 'trunk', 'slither', 'claws'];
let times = {'mane':1, 'stripes':2, 'trunk':3, 'slither':4, 'claws':5};

const html = '<table id="timetable"><tr>'
        + '<td>' + arr1.join('</td><td>') + '</td>'
        + '</tr><tr>'
        + '<td>' + arr2.map(v => times[v.toLowerCase()]).join('</td><td>') + '</td>'
        + '</tr></table>';

console.log(html);

И это вывод:

<table id="timetable">
  <tr>
    <td>lion</td>
    <td>tiger</td>
    <td>elephant</td>
    <td>snake</td>
    <td>bear</td>
  </tr>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
  </tr>
</table>

Примечание: я добавил times и некоторые значения там ... понятия не имею, какие данные существуют на самом деле, это всего лишь пример.

Ну, я начинаю думать, что times и другие вещи были просто скопированы в качестве примера кода, который вы собираетесь использовать для своей задачи. Итак, приведенный пример без times:

let arr1 = ['lion', 'tiger', 'elephant', 'snake', 'bear'];
let arr2 = ['mane', 'stripes', 'trunk', 'slither', 'claws'];

const html = '<table><tr>'
        + '<td>' + arr1.join('</td><td>') + '</td>'
        + '</tr><tr>'
        + '<td>' + arr2.join('</td><td>') + '</td>'
        + '</tr></table>';

console.log(html);

А вот и вывод (фактический вывод - одна строка с минимальным интервалом, вот как это будет выглядеть в инспекторе DOM браузера):

<table>
  <tr>
    <td>lion</td>
    <td>tiger</td>
    <td>elephant</td>
    <td>snake</td>
    <td>bear</td>
  </tr>
  <tr>
    <td>mane</td>
    <td>stripes</td>
    <td>trunk</td>
    <td>slither</td>
    <td>claws</td>
  </tr>
</table>

И в случае, если вам нужен ровно один цикл без грязных трюков, таких как .join() или .map(), вот решение (вывод такой же, как указано выше):

let arr1 = ['lion', 'tiger', 'elephant', 'snake', 'bear'];
let arr2 = ['mane', 'stripes', 'trunk', 'slither', 'claws'];

let html1 = '<table><tr>';
let html2 = '</tr><tr>';

for (let i = 0; i < arr1.length; i++) {
    html1 += '<td>' + arr1[i] + '</td>';
    html2 += '<td>' + arr2[i] + '</td>';
}

const html = html1 + html2 + '</tr></table>';

console.log(html);
...