IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

supprimer les colonnes vides d'un array Javascript


Sujet :

JavaScript

  1. #1
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut supprimer les colonnes vides d'un array Javascript
    Bonjour,

    j'ai un tableau Javascript (construit par un processus existant non modifiable).
    Ce tableau peut contenir des colonnes vides.
    Je souhaite supprimer ces colonnes vides si elles existent.

    je suis en train de monter une usine à gaz et je me demande s'il n'y a pas un moyen 'simple'.

    Merci de vos suggestions

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Salut.

    J'avoue que la notion de colonne d'un tableau JavaScript me laisse un peu perplexe... tu pourrais préciser ?

  3. #3
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    je suis perplexe aussi

    admettons qu'on ait un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var le_tableau=new array();
    le_tableau[1]=new array('cell 1 1','cell 1 2','cell 1 3');
    le_tableau[2]=new array('cell 2 1','cell 2 2','cell 2 3');
    le_tableau[3]=new array('cell 3 1','cell 3 2','cell 3 3');
    pour moi la colonne 1 est [ 'cell 1 1', 'cell 2 1', 'cell 3 1' ]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Pour éliminer l'index 2 : le_tableau.splice(2,1)

    Rappel peut-être inutile : Un tabelau JS commence à 0.

  5. #5
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    merci je connais tout ca.

    mais ma demande se situe plutot au niveau de la gestion d'une "colonne entiere".

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    C'est à dire que tu souhaites parcourir le contenu ? Faire un scan ?

    Le splice que je te propose est pour retirer l'index (le contenant) de contenu null.
    Si un delete supprime bien le contenu, il ne récupère pas le contenant.

  7. #7
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    je m'explique mal.

    en fait, je poursuis le post suivant qui consistait à créer un fichier CSV en parsant une <table> HTML.

    A chaque fois qu'on trouve une image, on crée une cellule vide (ce fontionnement me va), mais si on a une colonne ne contenant que des images, on va créer une colonne vide, sans intéret pour mon CSV.
    Je souhaite donc supprimer cette colonne.

    Je dois donc re-analyser ma table javascript générée une fois tout le contenu HTML traité afin de vérifier s'il y a des colonnes vides et les virer.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    faut faire une double boucle, faire un break dans la seconde si elle contient une valeur non null ou undefined, et enregistrer dans un nouveau tableau , la colonne correspondant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    function compactCols(array){
        var res = [];
        for(var i = 0, li = array.length, col; i < li; i++){
            col = array[i];
            for(var j = 0, lj = col.length, cell; j < lj; j++){
                cell = col[j]
                if(cell != undefined && cell != null && cell != ''){
                    res.push(col);
                    break;
                }
            }
        }
        return res;
    }  
     
    var le_tableau=new Array();
    le_tableau[0]=new Array('cell 1 1','cell 1 2','cell 1 3');
    le_tableau[1]=new Array('cell 2 1','cell 2 2','cell 2 3');
    le_tableau[2]=new Array('','','');
    le_tableau[3]=new Array('cell 4 1','cell 4 2','cell 4 3');
     
    le_tableau = compactCols(le_tableau);
    le retour de la fonction renvoie un nouveau tableau si tu veux garder absolument le même tableau, faudra jouer avec l'index des colonnes et de la taille du tableau.

  9. #9
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    tu ne geres pas une colonne entiere, tu geres les cellules vides.

    dans ton exemple, il n'y a aucune colonne vide.

    ici, la colonne 3 est vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    le_tableau[0]=new Array('cell 1 1','cell 1 2','','cell 1 4');
    le_tableau[1]=new Array('cell 2 1','cell 2 2','','cell 2 4');
    le_tableau[2]=new Array('','','','');
    le_tableau[3]=new Array('cell 4 1','cell 4 2','','cell 4 4');

  10. #10
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Tu peux passer par un autre tableau contenant des flags (true/false) par exemplepour savoir si une colonne est vide ou non, tu l'initialise avec false partout, puis dans ton scan, si la valeur existe, tu passes le flag de la colonne correspondante à true. A la fin de ta boucle, tu supprimes toutes les colonnes correspondant aux états false de ton tableau de flags.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    tu ne geres pas une colonne entiere, tu geres les cellules vides.

    dans ton exemple, il n'y a aucune colonne vide.

    ici, la colonne 3 est vide :
    Je pars du principe que tu a une matrice et que les tableaux en sont la structure, un peu comme un excel, ou une colonne existe indépendamment des données a l'intérieur.

    Quand tu dis la colonne 3 est vide, c'est le tableau qui forme la colonne qui est vide, ce qui correspond au titre de ton poste. Si tu veux vraiment testé l'existence de ta colonne alors pense que ca devrait faire l affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    function compactCols(array){
        var res = [];
        for(var i = 0, li = array.length, col; i < li; i++){
            col = array[i];
            if(!(col instanceof Array))
                break;
            for(var j = 0, lj = col.length, cell; j < lj; j++){
                cell = col[j]
                if(cell =! undefined && cell != null && cell != ''){
                    res.push(col);
                    break;
                }
            }
        }
        return res;
    }  
     
    var le_tableau=new Array();
    le_tableau[0]=new Array('cell 1 1','cell 1 2','cell 1 3');
    le_tableau[1]=new Array('cell 2 1','cell 2 2','cell 2 3');
    le_tableau[2]= '';
    le_tableau[3]=new Array('cell 4 1','cell 4 2','cell 4 3');
     
    le_tableau = compactCols(le_tableau);

  12. #12
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    @bovino, je suis en train de monter un truc dans le genre, mais je trouve ca assez lourd et je voulais savoir s'il y a un moyen plus rapide... apparemment pas

    @kimjoa, une colonne, c'est vertical.
    bien sur, une colonne n'existe pas au vue de ma structure, c'est sémantique et tres abstrait
    mais sachant qu'on va créer un tableau Excel à partir de mon tableau Javascript, une colonne sera tres visuelle, et si elle est vide, elle ne servira à rien

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    @kimjoa, une colonne, c'est vertical.
    merci de me le rapeller, mais j'étais au courant

    bien sur, une colonne n'existe pas au vue de ma structure, c'est sémantique et tres abstrait
    ba elle existe, ce sont les tableaux interne du tableau globale.

    mais sachant qu'on va créer un tableau Excel à partir de mon tableau Javascript, une colonne sera tres visuelle, et si elle est vide, elle ne servira à rien
    ba mon script renvoie un tableau sans les colonnes vide, je vois pas le problème

    mais je crois que ton problème viens du faite, que les lignes sont les index du tableaux globale, et les colonnes sont donc répartie dans les lignes, mais si c'est la cas, alors dsl, mais tu expose mal ton problème .... j'ai pas le temps de voire ca maintenant... ptet soir
    bye

  14. #14
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    ba elle existe, ce sont les tableaux interne du tableau globale.
    non, là deja on n'est pas d'accord.
    Tu dis que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    le_tableau[0]=new Array('cell 1 1','cell 1 2','cell 1 3');
    le_tableau[1]=new Array('cell 2 1','cell 2 2','cell 2 3');
    le_tableau[2]= '';
    le_tableau[3]=new Array('cell 4 1','cell 4 2','cell 4 3');
    une colonne est par exemple ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array('cell 2 1','cell 2 2','cell 2 3');
    ou alors je ne comprends pas ce que tu dis.


    ba mon script renvoie un tableau sans les colonnes vide, je vois pas le problème
    D'apres mes tests, ta fonction renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [ cell 1 1,cell 1 2,cell 1 3 ]
    [ cell 2 1,cell 2 2,cell 2 3 ]

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    non, là deja on n'est pas d'accord.
    Tu dis que dans
    Code :

    le_tableau[0]=new Array('cell 1 1','cell 1 2','cell 1 3');
    le_tableau[1]=new Array('cell 2 1','cell 2 2','cell 2 3');
    le_tableau[2]= '';
    le_tableau[3]=new Array('cell 4 1','cell 4 2','cell 4 3');


    une colonne est par exemple ?
    Code :

    Array('cell 2 1','cell 2 2','cell 2 3');

    ou alors je ne comprends pas ce que tu dis.
    t'as bien compris, mais reste a savoir, si dans ton script, les tableaux internes du tableau globale, sont bien des colonnes et non pas des lignes, sinon ca sera plus galère....
    D'apres mes tests, ta fonction renvoie
    Code :

    [ cell 1 1,cell 1 2,cell 1 3 ]
    [ cell 2 1,cell 2 2,cell 2 3 ]
    heu , oui, en effet le premier break devrait être remplacé pas un continue

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Par rapport à ta problématique, je te propose cette base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    var le_tableau=new Array();
    le_tableau[0]=new Array('cell 1 1','cell 1 2','','cell 1 4');
    le_tableau[1]=new Array('cell 2 1','cell 2 2','','cell 2 4');
    le_tableau[2]=new Array('','','','');
    le_tableau[3]=new Array('cell 4 1','cell 4 2','','cell 4 4');
     
    function suppress(ary) {
       for (var i=0; i < ary.length; i++) {
          if (ary[i] instanceof Array) { 
             suppress(ary[i]);
             if ( ary[i].join('') === '' ) delete(ary[i]);
          }
          if ( ary[i] === '' || ary[i] == null ) ary.splice(i--,1);
       }
       return ary;
    }
     
    alert((suppress(le_tableau)).toSource())
    Deux cas de figure :
    - String === ''
    - Un ancien Array est devenu null

  17. #17
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    j'ai l'impression qu'on n'est pas d'accord sur la notion de colonne.

    dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    le_tableau[0]=new Array('cell 1 1','cell 1 2','cell 1 3');
    le_tableau[1]=new Array('cell 2 1','cell 2 2','cell 2 3');
    le_tableau[2]= new Array('','','');
    le_tableau[3]=new Array('cell 4 1','cell 4 2','cell 4 3');
    la colonne 2 est
    ['cell 1 2', 'cell 2 2', '', 'cell 4 2']
    et ne doit être supprimée que si elle est égale à
    ['', '', '', '']

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Ok, donc tu ne veux pas supprimer les lignes, mais uniquement les colonnes.

    Pour tableau[i,j] on supprime les j s'ils sont === ''. C'est ça ?
    On est bien sur tableau[ligne, colonne] ?

    Il suffit de ne scanner que la première ligne.
    Si une colonne est vide, concatenation de colonne des lignes suivantes tant que vide et pas en fin de ligne.
    En fin de concatenation, si ton résultat est vide, tu splice l'ensemble de ces colonnes sur toutes tes lignes. j-1. Scan colonne suivante.

    Ou sinon, tu fait une rotation i,j vers j,i. join('') de chaque index, si c'est vide, splice. En fin nouvelle rotation. Terminé.

    Faut voir laquelle des deux méthodes est plus rapide.

  19. #19
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    ben voila 2 algos tres sympas.

    j'avais pensé à inverser les lignes et les colonnes mais si une fonction existait pour cela (et pour l'instant pas trouvé !)
    je vais me pencher sur tes idées

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    c'est bien ce que je pensais

    essaye ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    var compactCols = function(){
        //private globals
        var getColsLength = function(array){
            var colsLength = 0;
            for(var i = 0, l = array.length, colLength; i < l; i++){
                colLength = array[i].length;
                colsLength = colLength > colsLength ? colLength : colsLength;
            }
            return colsLength;
        },
     
        //test if a colonne is empty
        isEmptyCol = function(array, indexCols){
            for(var i = 0, l = array.length, cell; i < l; i++){
                cell = array[i][indexCols];
                if(cell =! undefined && cell != null && cell != '')
                    return false;
            }
            return true;
        };
     
        //public
        return function(array){
            var colsLength = getColsLength(array),
            indexCols = 0;
     
            for(; indexCols < colsLength; indexCols++){
                if(isEmptyCol(array, indexCols)){
                    for(var i = 0, l = array.length; i < l; i++){
                        array[i].splice(indexCols, 1);
                    }
                    colsLength--;
                    indexCols--;
                }
            }
     
            return array;
        }
    }();
     
     
    var le_tableau=new Array();
    le_tableau[0]=new Array('cell 1 1','cell 1 2','cell 1 3', '', 'cell 1 5');
    le_tableau[1]=new Array('cell 2 1','cell 2 2','cell 2 3', '', 'cell 2 5');
    le_tableau[2]=new Array('cell 3 1','cell 3 2','cell 3 3', '', 'cell 3 5');
     
    alert(compactCols(le_tableau))
    ça reste qu'une base à modifier, presque pas testé . A noter que t'as structure dois être créer , que chaque index du tableau globale soit des tableaux correspondant aux ligne.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Tableaux] Comment enlever les elements vide d'un array
    Par BernardT dans le forum Langage
    Réponses: 9
    Dernier message: 07/07/2006, 12h12
  2. CListCtrl Supprimer les colonnes.
    Par Bmagic dans le forum MFC
    Réponses: 2
    Dernier message: 26/06/2006, 12h35
  3. Réponses: 2
    Dernier message: 04/05/2006, 13h10
  4. supprimer les lignes vides?
    Par VinnieMc dans le forum Langage
    Réponses: 5
    Dernier message: 27/02/2006, 14h01
  5. [excel]comment supprimer une colonne vide...
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/10/2005, 13h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo