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

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

    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é
    Ce message n'a pas pu être affiché car il comporte des erreurs.
    «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

###raw>template_hook.ano_emploi###