我有一个包含两个维度的数组,我正在循环创建一个表格。例:
假设我有array[y][x]
。数组[0][x]
将填充标题列,array[1][x]
将创建第二列,依此类推。 y代表每个类别/行。这有点令人困惑所以这是一个图表:
[0][0]Device | [1][0] Device 1 | [2][0] Device 3 | [3][0] Device 1(Duplicate)
--------------------------------------------------------------------------------
[0][1]category1 | [1][1] | [2][1] | [3][1]
--------------------------------------------------------------------------------
[0][2]Category2 | [1][2] | [2][2] | [3][2]
我必须在[y][1]
的每列中检查重复项,如果array[y][1]
处有重复项,我根本不想打印该列。
我用两个嵌套的for循环打印每个列和行。
// for every named field, generate a row for each disk
//x represents each table category, which is in rows
for (var x = 0; x < array[0].length; x++) {
// code to print table with field_names[0][x]
for (var y = 1; y < (array.length); y++) {
new_row += "<td>" + [array[y][x]];
}
}
我目前的想法是每次进程到达数组[y] [1]我需要检查它是否与先前列[y-1] [1],[y-2] [1]的值匹配,[y-3] [1]等因为我只想打印表列的第一个实例。因此,我基本上正在寻找一种方法来制作一个for或while循环,不会出现打印狂乱并多次打印所有表格。在伪代码中,我需要做的事情:
if array[y][1] == array[i][1] where (i = (y - 1); i > 0; i--)
,然后不打印列。
唯一的问题是每次我尝试定义i时,它会影响其余的代码到我打印很多次的地方,因为一切都是嵌套的。请帮忙!非常感谢你
答案 0 :(得分:1)
你在思想段落中写下了答案。检查if
是否与if
匹配,然后不打印。
for(var y = 1; y< array.length; y++){
for(var x = 0; x < array[0].length; x++){
for(var i = array[0].length; ; i--){
if(array[y][i] == array[y][x]){
//don't print!
}else{
//print!
}
}
}
}
就性能而言,这不是最好的,但它会确保您不打印任何重复项。我会研究做什么@barmar建议为每一行创建一个对象。但是如果你不想那么你就应该能够实现上述功能来做你想做的事情。
答案 1 :(得分:0)
在打印之前,迭代每一行,记录第一次出现的值。每当您看到此记录不是新记录时,请不要打印它。
var found, aux;
for(var y = 1; y < array.length; y++) {
aux = {};
for(var x = 0; x < array[0].length; x++) {
found = false;
for (var i = 0; i < aux.length; i++) {
if (aux[i] == array[y][x]) { found = true; break; }
}
if (!found) {
aux.push(array[y][x]);
//render
}
}
}
效率不高,但......
希望我帮助过。