Bonjour,
Je m’interroge sur la meilleure méthode pour appliquer des filtres sur un Array en termes d’efficacité et de rapidité.
A la base, j’ai un Array d’objets. En cliquant sur divers boutons, l’utilisateur peut réduire l’Array pour n’afficher que des résultats pertinents. Rien de révolutionnaire.
J’utilise Vue, mais bon sur le principe, c’est juste du JS, hein. Pour l’instant, je peux appliquer facilement un filtre. Ci-dessous par exemple le principe pour le filtre sur le prix :
//Dans computed:
activities() {
return this.filteredActivities(this.filter);
},
//Dans les méthodes:
filterBy(type, value) {
this.filter.type = type;
this.filter.value = value;
console.log(this.filter);
},
//Dans le template
<v-btn-toggle v-model="price" mandatory @change="filterBy('price', price)">[etc.]
//Dans le store Vuex
filteredActivities: (state) => (filter) => {
if (filter.type === '') {
return state.orderedByDate;
}
else {
if (filter.type == 'price') {
if (filter.value == 'free') {
return state.orderedByDate.filter(activity => activity.price === '');
}
else if (filter.value == 'all') {
return state.orderedByDate;
}
else if (filter.value == 'fee') {
return state.orderedByDate.filter(activity => activity.price != '');
}
}
Donc tout ça fonctionne, c’est pas mal.
Mon souci maintenant c’est que sur certains filtres je dois retourner un Array, par exemple des catégories. Mon utilisateur clique sur des cases pour inclure des catégories qui l’intéressent ; ça construit un array qui ressemble à [’/api/category/1’, '/api/category/18’, [etc.]]. Il faut donc retourner la liste filtrée des activity qui ont dans leur array activity.categories la catégorie 1 OU la catégorie 18, OU la catégorie Bidule, etc. Et là je m’interroge sur la manière la plus économe en ressources pour effectuer cette opération. Des avis ?
Sinon, sur cette même fonction de filtres, j’ai deux autres interrogations.
1/ Quel serait le meilleur moyen de CUMULER des filtres ? Par exemple "gratuit" ET "categorie 18 ou categorie 1" ? Je pensais simplement à chaque application d’un filtre créer un array contenant les résultats de la recherche, puis réutiliser cet array comme base pour une nouvelle recherche, et donc modifier mon objet "this.filter" pour qu’il inclue le nombre de filtres en cours ? Y a-t-il mieux à faire ?
2/ Si on cumule des filtres, on doit pouvoir en ENLEVER. Et là, le plus simple n’est-il pas de recommencer chaque recherche à 0 avec les nouveaux filtres plutôt que de regarder comment rajouter dans la liste des résultats les Activity qu’il faudrait remettre ?
Bref je m’interroge.
Merci pour vos conseils.