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 :

Filter un JSON en profondeur


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Points : 98
    Points
    98
    Par défaut Filter un JSON en profondeur
    Salut !

    Voilà mon souci. Le JSON pronos a cette tête:

    Object event contient des objets matchs qui contient des objets pronos

    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
     
    [{
    	"id": 1,
    	"eventname": "EVENT1",
    	"round": "EVENT1-1",
    	"factor": 1,
    	"matchPassed": 10,
    	"matchs": [{
    		"eq1": "EQ1",
    		"eq2": "EQ2",
    		"scoreEq1": 0,
    		"scoreEq2": 3,
    		"passed": true,
    		"stats": {
    			"domicile": 35.29,
    			"exterieur": 35.29,
    			"nul": 29.41,
    			"boosted": 1
    		},
    		"date": 20190809,
    		"friendlyDate": "Vendredi  9 ao\u00fbt 2019 20:45",
    		"pronos": [{
    			"matchId": 10,
    			"userId": 1,
    			"username": "Marcel",
    			"points": 0,
    			"validation": true,
    			"pronoEq1": 1,
    			"pronoEq2": 0,
    			"booster": 0,
    			"MR": 0
    		},
    		...
    		]
    	},
    	...
    	],
    },
    	...
    ]

    J'aimerai filtrer ce json pour ressortir la même structure mais en ne conservant que les objects dans "pronos" dont le paramètre validation est false.
    Retirer également l'objet event si pronos[] vide et si matchs[] vide

    J'ai bien tenté quelque chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    return this.pronos.filter(event => {
          return event.matchs.filter((match) => {
            return match.pronos.filter((prono) => {
              return prono.validation === false;
            });
          }).filter((match) => {
            return match.pronos.length > 0;
          });
        }).filter((event) => {
          return event.matchs.length > 0;
        });
    ça n'est pas tout à fait correct il me semble.
    Pourtant, je trouvais ça plutôt logique ;-)

    En espérant que vous puissiez m'aider...

    A+
    Coincoin22

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 937
    Points
    22 937
    Billets dans le blog
    125
    Par défaut


    C'est une structure complexe, donc un accès complexe :

    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
    const datas = [{
        "id": 1,
        "eventname": "EVENT1",
        "round": "EVENT1-1",
        "factor": 1,
        "matchPassed": 10,
        "matchs": [{
            "eq1": "EQ1",
            "eq2": "EQ2",
            "scoreEq1": 0,
            "scoreEq2": 3,
            "passed": true,
            "stats": {
                "domicile": 35.29,
                "exterieur": 35.29,
                "nul": 29.41,
                "boosted": 1
            },
            "date": 20190809,
            "friendlyDate": "Vendredi  9 ao\u00fbt 2019 20:45",
            "pronos": [{
                    "matchId": 10,
                    "userId": 1,
                    "username": "Marcel",
                    "points": 0,
                    "validation": true,
                    "pronoEq1": 1,
                    "pronoEq2": 0,
                    "booster": 0,
                    "MR": 0
                },
     
            ]
        }],
    }];
     
    let validation = datas[0]["matchs"][0]["pronos"][0]["validation"];

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Points : 98
    Points
    98
    Par défaut
    Salut !

    Oui, c'est complexe.
    Je ne peux pas mettre d'index [0] car matchs est un tableau d'objets et pronos aussi.
    Il faut à tout prix que je filtre ces tableaux en parcourant tous les objets.

    Merci de ton aide

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 644
    Points : 66 671
    Points
    66 671
    Billets dans le blog
    1
    Par défaut
    un test typeof ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Points : 98
    Points
    98
    Par défaut
    Tu m'embrouilles là ?!

    J'ai simplifié ma demande

    INPUT:

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    [{
    		"eventId": 1,
    		"matchs": [{
    			"matchId": 1,
    			"pronos": [{
    				"pronoId": 1,
    				"validation": true
    			}, {
    				"pronoId": 2,
    				"validation": false
    			}, {
    				"pronoId": 3,
    				"validation": true
    			}]
    		}, {
    			"matchId": 2,
    			"pronos": [{
    				"pronoId": 4,
    				"validation": true
    			}, {
    				"pronoId": 5,
    				"validation": false
    			}, {
    				"pronoId": 6,
    				"validation": false
    			}]
    		}]
    	},
    	{
    		"eventId": 2,
    		"matchs": [{
    			"matchId": 3,
    			"pronos": [{
    				"pronoId": 7,
    				"validation": true
    			}, {
    				"pronoId": 8,
    				"validation": false
    			}, {
    				"pronoId": 9,
    				"validation": true
    			}]
    		}, {
    			"matchId": 4,
    			"pronos": [{
    				"pronoId": 10,
    				"validation": true
    			}, {
    				"pronoId": 11,
    				"validation": true
    			}, {
    				"pronoId": 12,
    				"validation": true
    			}]
    		}]
    	}
    ]

    Et ceci en sortie

    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
    [{
    		"eventId": 1,
    		"matchs": [{
    			"matchId": 1,
    			"pronos": [{
    				"pronoId": 2,
    				"validation": false
    			}]
    		}, {
    			"matchId": 2,
    			"pronos": [{
    				"pronoId": 5,
    				"validation": false
    			}, {
    				"pronoId": 6,
    				"validation": false
    			}]
    		}]
    	},
    	{
    		"eventId": 2,
    		"matchs": [{
    			"matchId": 3,
    			"pronos": [{
    				"pronoId": 8,
    				"validation": false
    			}]
    		}]
    	}
    ]
    Seuls les objets "prono" dont l'argument est validation : false.
    Le match id = 4 disparait car son pronos[] est vide

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Points : 98
    Points
    98
    Par défaut
    Salut !
    Etonnant que personne ne puisse m'aider....
    C'est un cas relativement commun ?!

    Merci à celui qui trouvera la solution !

    A+
    Coincoin22

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Points : 98
    Points
    98
    Par défaut
    J'ai progressé :

    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
     
    this.pronos.filter(event => {
          return event.matchs
            .some(match => {
              return match
                .pronos.filter(prono => prono.validation === false).length;
            });
        })
          .map(event => {
            event.matchs = event.matchs.filter(m => {
              m.pronos = m.pronos.filter(prono => prono.validation === false);
              return m;
            }).filter(match => {
              return match.pronos.length > 0;
            })
            return event;
          });
     
          });
    ça fait le job

    A+
    Coincoin22

  8. #8
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Salut,

    Et un vieux truc à l'ancienne?

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function tri(t){
     
    return t.forEach(v=>{
    	v.matchs.forEach(v=>{
    		v.pronos.forEach((v,i,ta)=>{
    			if(v.validation===true){delete ta[i]}
    		})
    	})
    })
    }
     
    tri(copytab)
    console.log(copytab)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [BDE][PARADOX][D7]Filter et RecordCount = résultat faux
    Par N1bus dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/10/2004, 22h15
  2. INSO Filter : "USER-defined exception" avec ctx_do
    Par Wiztiti dans le forum Oracle
    Réponses: 2
    Dernier message: 01/06/2004, 17h14
  3. Problème de profondeur
    Par nans80 dans le forum OpenGL
    Réponses: 4
    Dernier message: 07/04/2004, 22h51
  4. propriete filtered
    Par crocodingo dans le forum Bases de données
    Réponses: 9
    Dernier message: 15/02/2004, 21h08
  5. CFileDialog Filter
    Par Patrick Beaudoin dans le forum MFC
    Réponses: 4
    Dernier message: 07/09/2002, 10h51

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