2013-02-25 2 views
1

J'ai un tableau avec deux dimensions que je suis en boucle pour créer une table. Exemple: Disons que j'ai array[y][x]. le tableau [0][x] va remplir la colonne d'en-tête, array[1][x] va créer la deuxième colonne et ainsi de suite. y représente chaque catégorie/rangée. Il est un peu confus, alors voici un diagramme:Javascript: J'ai besoin d'une instruction If qui a une variable conditionnelle (For loop dans If Statement?)

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

Je dois vérifier les doublons dans chaque colonne à [y][1] et s'il y a un double à array[y][1], je ne veux pas imprimer cette colonne du tout.

J'imprime chaque colonne et ligne avec deux boucles imbriquées.

// 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]]; 
    } 
} 

Ma pensée actuelle est pour chaque fois que le processus arrive à tableau [y] [1] Je dois vérifier si elle correspond à la valeur pour les colonnes précédentes [y-1] [1], [y-2 ] [1], [y-3] [1] et ainsi de suite parce que je veux seulement imprimer la première instance de la colonne de table. Donc, je suis fondamentalement à la recherche d'un moyen de faire une boucle pour ce qui ne va pas sur une frénésie d'impression et d'imprimer toutes mes tables plusieurs fois. En pseudo-code, j'ai besoin de quelque chose qui fait:

if array[y][1] == array[i][1] where (i = (y - 1); i > 0; i--), puis ne pas imprimer la colonne.

Le seul problème est que chaque fois que j'essaie de définir i, il affecte le reste du code à l'endroit où j'imprime un tas de fois car tout est imbriqué. S'il vous plaît aider! et merci beaucoup.

+0

Créez un objet pour chaque ligne dont les propriétés sont les valeurs qui ont déjà été vues. Vérifiez ensuite si la propriété existe avant d'afficher la colonne. – Barmar

+0

Vous devez transposer le tableau à un tableau. Cela rend la mémoire plus efficace, et vous pouvez facilement [supprimer les doublons] (http://stackoverflow.com/q/1960473/1048572) de celui-ci – Bergi

Répondre

1

Vous avez écrit la réponse dans votre paragraphe de pensées. Vérifiez if il correspond if il n'imprime alors pas.

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

Ce n'est pas le meilleur en ce qui concerne les performances, mais il vous assurera que vous n'imprimez pas de doublons. Je regarderais dans faire ce que @barmar a suggéré qui crée un objet pour chaque rangée. Mais si vous ne voulez pas alors vous devriez être en mesure de mettre en œuvre ce qui précède pour faire ce que vous voulez.

0

Avant l'impression, parcourez chaque ligne en conservant l'enregistrement des valeurs qui apparaissent déjà pour la première fois. Chaque fois que vous voyez que cet enregistrement n'est pas nouveau, ne l'imprimez pas.

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 
     } 

    } 
} 

Non pas efficace, mais ...

Espoir j'ai aidé.