Pages

filtre, map ...

Le chaînage des filtres élémentaires

const population = [

    { nom: "Dupont"ville: "evry"sex: "f"born: 1970 },
    { nom: "Dupont"ville: "Paris"sex: "f"born: 1980 },
    { nom: "Brusel"ville: "belfort"sex: "h"born: 1969 },
    { nom: "SuperDupont"ville: "Evry"sex: "f"born: 1971 },
    { nom: "Leroy"ville: "Paris"sex: "f"born: 1984 },
    { nom: "Tony"ville: "belfort"sex: "h"born: 2000 },

];

//definitions pour filtre

const setAge = (pers=> {
    let age = new Date().getFullYear() - pers.born;
    return Object.assign(pers, { age });
}
const people = population.map(setAge),
femme = {
     genre: "f"
},
     homme = {
        genre: "h"
     },
     cinquante = {
        age: 50,
    },
    quarante = {
        age: 40,
    },
    Évryens = {
        ville: "evry",
    },

    genre = function ({ sex }) {
        return sex == this.genre;
    },

    trancheAge = function ({ age }) {
        return age > this.age;
    },

    habitant = function ({ ville }) {
        return ville.toLowerCase() == this.ville.toLowerCase();
    },


// on peut filtrer maintenant sans effort
    
    f50 = people.filter(genrefemme)
         .filter(trancheAgecinquante),

    h50 = people.filter(genrehomme)
         .filter(trancheAgequarante),

evryC19 = people.filter(habitantÉvryens)
        .filter(trancheAgecinquante)
         .filter(genrehomme);

 lien


Les filtres dans un tableaux !

Il est intéressant de mettre des fonctions dans des tableaux :
  1. const pipeline = [
  2.   function A,
  3.   function B, ...
  4. ];
  5. for( let action of pipeline) {
  6.    objet = action( objet );
  7. }
L'intérêt du code est en lig. 6 : Chaque actions renvoie l'objet pour l'action suivante.

👿Cette technique est à la base des filtres de Photoshop.

Voici un exemple de chainage d'actions sur un point. Code

Appliquons ce principe sur nos filtres avec la géniale utilisation de la méthode every en lig.2.
  1. const customFilter = (array, ...queries=> {
  2.    return array.filter( pers => queries.every( query => query(pers) ));
  3. },
  4.         
  5. resultQuery = customFilter(population,
  6.             ( { nom } ) => nom == "SuperDupont",
  7.             ( { born } ) => new Date().getFullYear() - born > 40,
  8.             ( { sex  } ) => sex == "f",
  9.             ( { ville} ) => ville == "evry"
  10.         );



👍 Améliorations

  1. const customFilter = (array, ...tests) => {
  2.     return array.filter(pers => tests.every(t => t(pers)));
  3. }

  4. const filtre = (query) =>
  5. customFilter(population,
  6.      ( {nom} )    => query.nom ? nom.toLowerCase() == query.nom : true,
  7.      ( { born } ) => query.born ? new Date().getFullYear() - born > query.born : true,
  8.      ( { sex }  ) => query.sex ? sex == query.sex : true,
  9.      ( { ville }) => query.ville ? ville.toLowerCase() == query.ville : true
  10. );

  11. const firstQuery = {
  12.    nom:"dupont",
  13.    born:40,
  14.    sex:"f",
  15.    ville:"paris",
  16. }

  17. console.log(filtre (firstQuery))

  18. const Evryens = {
  19.    ville:"evry",
  20. }

  21. console.log(filtre (Evryens))

                                                  💪A step futher, 

                                                  Pour ceux qui n'auraient pas lu " avoid using bind "

                                                  notez lig.7 la présence de bind.


                                                  1. nom =   function ( {nom} )  { return nom.toLowerCase() == this.nom },
                                                  2. age =   function ( { born } ) { return new Date().getFullYear() - born > this.born},
                                                  3. genre = function ( { sex }  ) { return sex == this.sex},
                                                  4. habite =function ( { ville }) { return ville.toLowerCase() == this.ville},

                                                  5. customFilter = (array, query, ...tests) => {
                                                  6.     return array.filter(pers => tests.every(t => t.bind(query)(pers)));
                                                  7. }

                                                  8. const myQuery = {
                                                  9.    nom:"dupont",
                                                  10.    born:40,
                                                  11.    sex:"f",
                                                  12.    ville:"paris",  
                                                  13. }
                                                  14. const query1 = customFilter(population, myQuery, nom,age,genre,habite);
                                                  15. console.log(query1);

                                                  16. const query2 = customFilter(population, myQuery, habite);
                                                  17. console.log(query2)