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 :

group by et concat dans tableau JS


Sujet :

JavaScript

  1. #1
    Membre �clair�
    Homme Profil pro
    consultant environnement et d�veloppement d'applications de base de donn�es
    Inscrit en
    Janvier 2006
    Messages
    336
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : consultant environnement et d�veloppement d'applications de base de donn�es
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 336
    Par d�faut group by et concat dans tableau JS
    Bonjour,
    Je m'arrache les cheveux alors j'en appel � la communaut� JS...
    J'ai un tableau associatif JS de ce type :

    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
    0: {famille: "produitIlot", code: "ECART_DISTANCE_EAU", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2185", …}
     
    1: {famille: "produitIlot", code: "ECART_DISTANCE_RIVERAIN", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2185", …}
     
    2: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null, …}
     
    3: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null, …}
     
    4: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2169", …}
     
    5: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2172", …}
     
    6: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2170", …}
     
    7: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2131", …}
     
    8: {famille: "melange", code: "PROD_MELANGE_INTERDIT", prod_id: 2, prod_lib: "", ilot_key: null, …}
     
    9: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null, …}
     
    10: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null, …}
     
    11: {famille: "melange", code: "PROD_MELANGE_INTERDIT", prod_id: 2, prod_lib: "", ilot_key: null, …}
     
    12: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null, …}
     
    13: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null, …}
    je cherche � :
    - supprimer les lignes en doublon tout d'abord...
    - g�n�rer un tableau group� par prod_id puis code avec concat�nation des ilot_key... ce qui donnerait :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
        tab_nc_prod[1] = [ {code:"ECART_DISTANCE_EAU",ilots:"2185"},{code:"ECART_DISTANCE_RIVERAIN",ilots:"2185"},{code:"DEPASSEMENT_NB_APPLICATION",ilots:"2169,2172,2170,2131"} ]
        tab_nc_prod[2] = [ {code:"PROD_MELANGE_INTERDIT",ilots:""} ]
    - un autre tableau group� par ilot_key puis code mais avec concat�nation des prod_id et prod_lib cette fois-ci...
    j'arrive � grouper � un niveau sur prod_id ou ilot_key avec reduce mais je n'arrive pas � faire le second niveau de regroupement avec concat�nation de certaines propri�t�s.
    merci de votre aide

    guen

  2. #2
    Expert confirm�
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 681
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 681
    Par d�faut
    vous pouvez parcourir la liste avec "forEach" comme cela :
    https://developer.mozilla.org/fr/doc.../Array/forEach

  3. #3
    Membre �clair�
    Homme Profil pro
    consultant environnement et d�veloppement d'applications de base de donn�es
    Inscrit en
    Janvier 2006
    Messages
    336
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : consultant environnement et d�veloppement d'applications de base de donn�es
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 336
    Par d�faut
    parcourir certes mais comment je fais les regroupements et concat�nations ? merci de votre aide.

  4. #4
    Expert confirm� Avatar de Toufik83
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 520
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 520
    Par d�faut
    Bonjour,

    J'ai fais un test vite fait pour arriver au r�sultat souhait� :
    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
     
       let obj = [] ;
       Array
      .from(new Set(tab_nc_prod.map(JSON.stringify).map(JSON.parse)))
      .map((value,index,self) => {
        !obj[value.prod_id]&&value.prod_id!=null ? obj[value.prod_id] = [] : '';
    	if(obj[value.prod_id])
    	self
    	.map((v) => {
    		if(v.code==value.code&&v.prod_id==value.prod_id){
    		let index=obj[value.prod_id].map(item=>{ return item.code;}).indexOf(v.code);
    		if(index>-1){
    			if(obj[value.prod_id][index].ilots!=null){
    				if(obj[value.prod_id][index].ilots.indexOf(value.ilot_key)==-1)
    					obj[value.prod_id][index].ilots+= ',' + value.ilot_key;
    			}
    			else{
    				obj[value.prod_id][index].ilots=value.ilot_key;
    			}
    		}
    		else{
    			  obj[value.prod_id]
    			  .push({
    				'code':value.code,
    				"ilots":value.ilots != null 
    					? value['ilots'] + ',' + value.ilot_key 
    					: value.ilot_key
    			  });
    		  }
    		}
    	});
     });
    //affichage
    console.log(obj);
    R�sultat :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    1: Array(3)
       0: {code: "ECART_DISTANCE_EAU", ilots: "2185"}
       1: {code: "ECART_DISTANCE_RIVERAIN", ilots: "2185"}
       2: {code: "DEPASSEMENT_NB_APPLICATION", ilots: "2169,2172,2170,2131"}
    2: Array(1)
      0: {code: "PROD_MELANGE_INTERDIT", ilots: null}
    Le principe est le m�me pour les autres propri�t�s, tu peux m�me cr�er une fonction avec des param�tres pour pr�ciser les propri�t�s � regrouper.

  5. #5
    Mod�rateur
    Avatar de joel.drigo
    Homme Profil pro
    Ing�nieur R&D - D�veloppeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 55
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D - D�veloppeur Java
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par d�faut
    Salut,

    Pour commencer il faut d�finir la structure qu'on veut obtenir.

    Ensuite on d�finit le plus simplement possible ce que veut dire regrouper sur une valeur de propri�t�. En entr�e, on a une m�me valeur de code avec diff�rentes valeurs qu'on veut regrouper par cette valeur de code. Ce qui veut dire qu'on va avoir une structure telle qu'une propri�t� unique "code" va avoir une valeur qui est le regroupement des diff�rentes valeur.

    Par exemple, si on veut les produits d'id null dans le r�sultat, on utilisera un tableau associatif dont les clefs sont des prod_id et les valeurs des tableaux associatifs, dont les clefs sont la propri�t� de regroupement, donc le code.

    Ensuite, on parcourt les entr�es du tableau associatif en entr�e, avec un foreach par exemple comme indiqu� par @Mathieu.

    Ensuite on d�finit comment pour chaque code, de chaque valeur d'entr�e, on �tablit comment obtenir la valeur finale, une concat�nation des clefs de lots.
    Le traitement des ilots null va conditionner les code final (si on les int�grer dans le r�sultats, ou pas).
    Il faut �galement d�finir comment la concat�nation va �tre faite. Par exemple, on d�cide de s�parer les clefs de lots par des virgules, avec une espace apr�s par exemple, pour la lisibilit�.

    Donc si on part du principe qu'on veut les prod_id null mais pas les clefs de lots null.

    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
     
    var input =  {0: {famille: "produitIlot", code: "ECART_DISTANCE_EAU", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2185"},
    1: {famille: "produitIlot", code: "ECART_DISTANCE_RIVERAIN", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2185"},
    2: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null},
    3: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null},
    4: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2169"},
    5: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2172"},
    6: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2170"},
    7: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2131"},
    8: {famille: "melange", code: "PROD_MELANGE_INTERDIT", prod_id: 2, prod_lib: "", ilot_key: null},
    9: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null}, 
    10: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null},
    11: {famille: "melange", code: "PROD_MELANGE_INTERDIT", prod_id: 2, prod_lib: "", ilot_key: null},
    12: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null},
    13: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null}
    };
     
    var output= {};
     
    for (const [key, value] of Object.entries(input)) { // on parcourt les entrées du tableau associatif
      var prod_id = (value.prod_id===null?"null":value.prod_id); // on prends le produit correspondant dans le résultat
     
      if ( typeof output[prod_id] === 'undefined' ) // si ce produit n'était pas déjà présent...
          output[prod_id] = {}; // ... on l'initialise
     
      var prod = output[prod_id]; // on travaille ensuite sur le produit
     
      if ( typeof prod[value.code]  === 'undefined' ) // si il n'existe pas encore de ilots pour le code de l'entrée courante, on l'initialise
           prod[value.code] = null; 
     
     
      if ( prod[value.code] === null ) // si la "liste" de lots est null...
        prod[value.code] = value.ilot_key; //  ... alors la nouvelle liste est le lot courant (il peut être null mais par coïncidence, la liste sera null aussi)
      else if ( value.ilot_key !== null ) { // si le produit courant a un ilot
        if ( prod[value.code] !== null ) // si on a déjà une concaténation de key de ilots, alors on ajoute un séparateur
           prod[value.code] += ', '; 
        prod[value.code] += value.ilot_key;
      }
     
    }
     
    console.log(output);


    Le r�sultat :
    Code json : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
      1: {
        DEPASSEMENT_NB_APPLICATION: "2169, 2172, 2170, 2131",
        ECART_DISTANCE_EAU: "2185",
        ECART_DISTANCE_RIVERAIN: "2185"
      },
      2: {
        PROD_MELANGE_INTERDIT: null
      },
      null: {
        DATE_ABSENT: null
      }
    }

    Je suis parti du principe qu'un ilot ne peut se r�p�ter entre code, ou que �a ne g�ne pas qu'il se r�p�te dans la concat�nation. Dans le cas contraitre, il serait plus simple d'utiliser un tableau pour stocker les codes (avec un test de Array.includes() pour �viter de stocker plusieurs fois le m�me ilot) et faire un Array.join() � la fin, pour finaliser le r�sultat sous forme de concat�nation.


    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
     
    var input =  {0: {famille: "produitIlot", code: "ECART_DISTANCE_EAU", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2185"},
    1: {famille: "produitIlot", code: "ECART_DISTANCE_RIVERAIN", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2185"},
    2: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null},
    3: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null},
    4: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2169"},
    5: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2172"},
    6: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2170"},
    7: {famille: "produitIlot", code: "DEPASSEMENT_NB_APPLICATION", prod_id: 1, prod_lib: "PLEDGE", ilot_key: "2131"},
    8: {famille: "melange", code: "PROD_MELANGE_INTERDIT", prod_id: 2, prod_lib: "", ilot_key: null},
    9: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null}, 
    10: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null},
    11: {famille: "melange", code: "PROD_MELANGE_INTERDIT", prod_id: 2, prod_lib: "", ilot_key: null},
    12: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null},
    13: {famille: "dates", code: "DATE_ABSENT", prod_id: null, prod_lib: null, ilot_key: null}
    };
     
    var output= {};
     
    for (const [key, value] of Object.entries(input)) {
      var prod_id = (value.prod_id===null?"null":value.prod_id);
     
      if ( typeof output[prod_id] === 'undefined' ) 
          output[prod_id] = {};
      var prod = output[prod_id];
     
      if ( typeof prod[value.code]  === 'undefined' ) // si on a pas déjà un tableau intermédiaire de stockage des clefs pour ce code...
           prod[value.code] = []; // on initialise ce tableau 
     
      if ( value.ilot_key !== null && !prod[value.code].includes(value.ilot_key) ) // si la clef de lot n'est pas null, et qu'elle n'est pas déjà dans le tableau
           prod[value.code].push(value.ilot_key); // on la stocke dans le tableau
     
    }
     
    // on transforme le résultat pour avoir une concaténation
    for (const [key, value] of Object.entries(output)) { // on parcourt les entrées du résultat 
      for (const [code, prod_code_value] of Object.entries(value))   { // on parcourt les codes pour chaque entrée, soit des tableaux
         if ( prod_code_value.length===0 ) { // si le tableau est vide
            value[code] = null; // ou chaîne vide si on veut
         }
         else {
            value[code] = prod_code_value.join(', ');
         }
      }
    }
     
    console.log(output);


    La structure r�sultat est diff�rente de celle que tu cherches � obtenir, mais le raisonnement de base (le regroupement) est le m�me. Je te laisse donc adapter le code pour g�rer la structure que tu cherches � obtenir. La diff�rence essentielle �tant qu'au lieu d'avoir un objet avec des clefs qui sont directement les codes, tu as un tableau avec des objets avec une propri�t� code. un Array.find suffit � modifier l�g�rement le code pour g�rer cette diff�rence.

    L'�tape suivante, pour faire un "group by", un peu plus complexe pour un d�butant peut-�tre, est de regarder la fonction Array.reduce().
    L'expression "�a marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le probl�me.
    La plupart des r�ponses � vos questions sont d�j� dans les FAQs ou les Tutoriels, ou peut-�tre dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement pos�e et r�dig�e et vous aurez plus de chances de r�ponses adapt�es et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'�diteur de messages).
    Nouveau sur le forum ? Consultez Les R�gles du Club.

  6. #6
    Membre �clair�
    Homme Profil pro
    consultant environnement et d�veloppement d'applications de base de donn�es
    Inscrit en
    Janvier 2006
    Messages
    336
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : consultant environnement et d�veloppement d'applications de base de donn�es
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 336
    Par d�faut
    merci � vous deux pour vos r�ponses bien d�velopp�es ! cela va me permettre de trouver la solution j'en suis s�r.

Discussions similaires

  1. NULLPOINTEREXCEPTION dans la classe Groupe. impossibilit� de trouver un tableau d'objets
    Par salut_tout_le_monde dans le forum D�buter avec Java
    R�ponses: 5
    Dernier message: 31/03/2017, 02h17
  2. Groupe de lignes dans tableau
    Par AnkyFive dans le forum D�veloppement de jobs
    R�ponses: 12
    Dernier message: 17/02/2016, 13h22
  3. Groupe de controles diff�rents dans un tableau
    Par jacko842 dans le forum VB 6 et ant�rieur
    R�ponses: 7
    Dernier message: 11/08/2009, 20h07
  4. Ne pas toujours afficher un groupe dans tableau crois�
    Par leloup84 dans le forum SAP Crystal Reports
    R�ponses: 6
    Dernier message: 15/04/2008, 13h04
  5. GROUP BY et HAVING dans un UPDATE
    Par MashiMaro dans le forum Langage SQL
    R�ponses: 3
    Dernier message: 26/08/2003, 08h03

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