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

Angular Discussion :

Filtrer deux objets entre eux


Sujet :

Angular

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : octobre 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Filtrer deux objets entre eux
    Bonjour, après de nombreuses recherches je n'arrive pas à filtrer un tableau d'objet par rapport à un autre.

    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
     userPrefTest = {
        domain:
        [
          {id: 1, label: "domain1"},
          {id: 2, label: "domain2"},
          {id: 3, label: "domain3"},
        ],
        commodity:
        [
          {id: 1, label: "commodity1"},
          {id: 2, label: "commodity2"},
          {id: 3, label: "commodity3"},
          {id: 4, label: "commodity4"},
        ]
      };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      projectTypeList = 
      [
        {id: 1, label: "pro1", domain: [{id: 1, label: "domain1"}, {id: 2, label: "domain2"}], commodity: [{id: 1, label: "com1"}, {id: 2, label: "com2"}]},
        {id: 2, label: "pro2", domain: [{id: 1, label: "domain1"}, {id: 3, label: "domain3"}], commodity: [{id: 1, label: "com1"}, {id: 2, label: "com2"}, {id: 4, label: "com3"}]},
        {id: 3, label: "pro3", domain: [{id: 4, label: "domain4"}, {id: 5, label: "domain5"}], commodity: [{id: 1, label: "com1"}]}
    ]
    Je voudrait obtenir un tableau de projectType dont au moins un domaine est présent dans l'objet userPrefTest.

    Quelqu’un aurait une méthode ou au moins une piste pour me mettre sur la bonne voie.

    Merci d'avance ; )

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    janvier 2011
    Messages
    14 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2011
    Messages : 14 038
    Points : 34 646
    Points
    34 646
    Par défaut
    Bonjour,
    Je voudrait obtenir un tableau de projectType dont au moins un domaine est présent dans l'objet userPrefTest.
    il faudrait surement être plus clair sur le résultat/filtrage attendu, peut être même un exemple du résultat souhaité !

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : octobre 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'aimerais obtenir un tableau d'objet de type projectType (id, label, domain[], commodity[]).

    Dans l'exemple ci dessus le tableau attendu est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    projectTypeList = 
    [
    {id: 1, label: "pro1", domain: [{id: 1, label: "domain1"}, {id: 2, label: "domain2"}], commodity: [{id: 1, label: "com1"}, {id: 2, label: "com2"}]},
    {id: 2, label: "pro2", domain: [{id: 1, label: "domain1"}, {id: 3, label: "domain3"}], commodity: [{id: 1, label: "com1"}, {id: 2, label: "com2"}, {id: 4, label: "com3"}]}
    ]
    car seuls les deux premiers objets de la liste ont au moins un domaine avec un id identique à l'un des domaines de userPrefTest

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    janvier 2011
    Messages
    14 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2011
    Messages : 14 038
    Points : 34 646
    Points
    34 646
    Par défaut
    Ce n'est toujours pas très clair pour moi concernant les données de départ.

    Je vais supposer que ton objet projectTypeList constitue l'objet à tester et ce fonction des données disponibles dans userPrefTest et supposer également que les relations id -> label sont uniques.

    Une façon de faire serait de
    créer un tableau des domaines autorisés à partir de userPrefTest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // création d'un tableau des données autorisées
    const authorizedDomain = [];
    userPrefTest.domain.forEach((el) => {
      const ind = el.id;
      authorizedDomain[ind] = el.label;
    });
    puis parcourir les éléments de projectTypeList -> domain pour vérifier que tous les domaines sont des domaines autorisés, par exemple :
    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
    // Array résultat
    const resultTypeList = [];
    // parcours des données pour test
    projectTypeList.forEach((el) => {
      // init flag OK true par défaut
      let resultOK = true;
      // parcours de chaque élément domain de l'objet
      el.domain.forEach((dom) => {
        // mise à jour suivant résultat
        resultOK = resultOK && authorizedDomain.includes(dom.label);
      });
      // si tout est autorisé stockage d'une copie de l'objet en cours
      if (resultOK) {
        resultTypeList.push({...el});
      }
    });
    // affichage du résultat
    console.log("resultTypeList :", resultTypeList);
    voilà pour un principe ...

  5. #5
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    mai 2010
    Messages
    2 431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2010
    Messages : 2 431
    Points : 4 374
    Points
    4 374
    Par défaut
    juste en utilisant les méthodes
    -- array.filter => pour filter https://developer.mozilla.org/fr/doc...x/Array/filter
    -- array.reduce => pour déterminer si l'in des labels des différents label est présent dans userPrefTest.domain [ label... (initialiser à false
    https://developer.mozilla.org/fr/doc...x/Array/reduce

    via un array.find https://developer.mozilla.org/fr/doc...aux/Array/find
    en transformant la présence en true / false via une bete fonction Boolean

    donc voila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const result = projectTypeList
                    .filter(elm=>elm.domain.reduce((test,dom)=>
                      (test||Boolean(userPrefTest.domain.find(ud=>ud.label===dom.label))),false))


    test complet
    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
    const
    userPrefTest =  { domain:     [ { id: 1, label: 'domain1' } 
                                  , { id: 2, label: 'domain2' } 
                                  , { id: 3, label: 'domain3' } 
                                  ] 
                    , commodity:  [ { id: 1, label: 'commodity1' } 
                                  , { id: 2, label: 'commodity2' } 
                                  , { id: 3, label: 'commodity3' } 
                                  , { id: 4, label: 'commodity4' } 
                      ] 
                    } 
    ,
    projectTypeList = [ { id:        1
                        , label:     'pro1'
                        , domain:    [ { id: 1, label: 'domain1' }, { id: 2, label: 'domain2' } ]
                        , commodity: [ { id: 1, label: 'com1' },    { id: 2, label: 'com2' }    ] 
                        } 
                      , { id:        2
                        , label:     'pro2'
                        , domain:    [ { id: 1, label: 'domain1' }, { id: 3, label: 'domain3' } ] 
                        , commodity: [ { id: 1, label: 'com1' },    { id: 2, label: 'com2' },   { id: 4, label: 'com3' } ] 
                        } 
                      , { id:        3
                        , label:     'pro3'
                        , domain:    [ { id: 4, label: 'domain4' }, { id: 5, label: 'domain5' } ] 
                        , commodity: [ { id: 1, label: 'com1' } ] 
                        } 
                      ] 
    ;
    const result = projectTypeList
                    .filter(elm=>elm.domain.reduce((test,dom)=>
                      (test||Boolean(userPrefTest.domain.find(ud=>ud.label===dom.label))),false))
     
     
    console.log( result )
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

Discussions similaires

  1. Problème pour joindre deux fichiers entre eux
    Par Il_TiRaNNo dans le forum Linux
    Réponses: 1
    Dernier message: 15/12/2009, 13h28
  2. Lier deux combobox entre eux
    Par zabdaniel dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/02/2009, 11h06
  3. Comment connecter deux PC entre eux
    Par deubelte dans le forum Windows XP
    Réponses: 7
    Dernier message: 27/08/2008, 11h25
  4. Filtrer une table en comparant deux champs entre eux
    Par damene dans le forum Débuter
    Réponses: 13
    Dernier message: 12/04/2008, 20h10
  5. Réponses: 14
    Dernier message: 13/11/2007, 20h46

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