我不知道问这个问题的正确方法,因为我已经搜索并尝试实施其他方法而没有运气。 Javascript不是我的强项,所以请多多包涵。
我有一个输入看起来像,每个条目可以具有不同的宽度:#abcde#fghij#klmno
我根据字符分割输入,最后得到一个看起来像这样的数组:["abcde","fghij","klmno"]
我需要输出一个表,以使第一列包含第一个字符串中的所有字母,每个字母都在其自己的行中,基本上以一个如下表结尾:
a f k
b g l
c h m
d i n
e j o
到目前为止,我已经有效地拆分了字符串,但是创建表时遇到了麻烦。我在SO上尝试了多种不同的解决方案,但没有走运。我的经验不足使我在处理每个步骤时都感到困惑。尽管我尝试的实现均未成功,但我已经为我认为需要在for循环的每个块中添加了注释。
var table = document.createElement("table");
var tr = document.createElement("tr");
var td = document.createElement("td");
var th = document.createElement("th");
var checkbox = document.createElement("input");
checkbox.type("checkbox");
//split string
var splitStringArray = inputString.split("#");
for (var i = 0; i < splitStringArray; i++) {
//iterate through array and create a column for each string in the array
tr.appendChild(document.createElement(th));
//for each string, iterate through each character
var temp = splitStringArray[i].split("");
for (var j = 0; j < temp.length; j++) {
//add a row for each character in the string, each cell should have a checkbox and the letter associated with it
td.appendChild(document.createTextNode[i][j]);
td.appendChild(checkbox);
//This this the step that I'm running into issues with
}
}
tableArea.appendChild(table);
我遇到的问题区域之一是字符串长度不会相同,并且需要以与输入顺序相同的顺序显示。
这使得很难创建一定数量的行,然后逐行而不是逐列地填充它们。
最佳答案
首先,我们将输入字符串拆分为哈希字符(#)。接下来,我们过滤结果数组,只返回不是空字符串的元素。
从那里,我们创建另一个数组,第一个数组中每个字符串的长度。我们将这个长度数组降序排列,并采用第一个元素-这对应于最长单词的长度-这将是我们需要的行数。列数来自我们首先计算的数组长度-初始输入字符串中的单词数。
从那里开始,我们仅浏览数据并创建表,tr和td元素。理想情况下,我们还应该创建一个tbody元素并将tr元素放置在其中而不是表格中。
function newEl(tag){return document.createElement(tag)}
window.addEventListener('load', onDocLoaded, false);
function onDocLoaded(evt)
{
var tbl = testFunc('#abcde#fghij#klmno');
document.body.appendChild(tbl);
}
function testFunc(inputStr)
{
var wordArray = inputStr.split('#').filter(function(str){return str != '';});
var lengthArray = wordArray.map( function(str) {return str.length;} );
var numColumns = wordArray.length;
lengthArray.sort( function(a, b){return b-a} );
var maxRows = lengthArray[0];
var tbl = newEl('table');
var tbody = newEl('tbody');
tbl.appendChild(tbody);
for (var row=0; row<maxRows; row++)
{
var tr = newEl('tr');
for (var col=0; col<numColumns; col++)
{
var td = newEl('td');
td.textContent = wordArray[col][row];
tr.appendChild(td);
}
tbody.appendChild(tr);
}
return tbl;
}