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 :

Filtrer un objet JSON


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 Filtrer un objet JSON
    Salut !

    Je suis nouveau sur le développement WEB angular.

    Imaginons un json de cette forme :

    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
    [{	
    	"event1": "Tournoi Marseille",
    	"event2": "Tournoi Lyon",
    	"event3": "Tournoi Toulouse"	
    },
    {	
    	"event1": "Tournoi Marseille",
    	"event2": "Tournoi Lyon",
    	"event3": "Tournoi Nantes"	
    },
    {	
    	"event1": "Tournoi Paris",
    	"event2": "Tournoi Lyon",
    	"event3": "Tournoi Bastia"	
    },
    {	
    	"event1": "Tournoi Brest",
    	"event2": "Tournoi Lyon",
    	"event3": "Tournoi Grenoble"	
    }][
    puis un tableau contenant des mots clés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ["Lyon", "Marseille","Nantes"]
    Comment à l'aide de filters, some ou autres ne produire en sortie que les objets qui matchent avec ces trois keywords :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [{	
    	"event1": "Tournoi Marseille",
    	"event2": "Tournoi Lyon",
    	"event3": "Tournoi Nantes"	
    }]
    Un tableau de keywords
    produirait alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [{	
    	"event1": "Tournoi Marseille",
    	"event2": "Tournoi Lyon",
    	"event3": "Tournoi Toulouse"	
    },
    {	
    	"event1": "Tournoi Marseille",
    	"event2": "Tournoi Lyon",
    	"event3": "Tournoi Nantes"	
    }]
    Merci de votre aide...

    Coincoin22

  2. #2
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Points : 2 006
    Points
    2 006
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Déjà je n'utiliserais pas un objet avec des clés (event1, event2...) mais un tableau. Tu n'as pas besoin de ces clés, si tu boucles sur les items tu sais que le premier est ton event1, le deuxième event2 etc et tu n'as pas à réécrire ta configuration si tu veux changer le nombre d'events.

    Ensuite tu peux tester les noms avec la fonction indexOf() qui renvoie -1 si la string recherchée n'a pas été trouvée. https://www.w3schools.com/jsref/jsref_indexof.asp

  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 !
    Merci de ton aide ...

    L'exemple que je t'ai donné est là pour simplifier ma demande.
    Les json sont beaucoup plus complexes dans la réalité.

    il y a notamment des champs eq1, eq2, eventname, round sur lesquels je veux faire mon tri.

    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
    [{
    eq1: "Lyon"
    eq2: "Angers"
    eventid: 2
    eventname: "Ligue 1"
    match_id: 13
    round: "2ième Journée"
    score_eq1: null
    score_eq2: null
    ...
    },{
    eq1: "Marseille"
    eq2: "Brest"
    eventid: 1
    eventname: "Ligue 1"
    match_id: 6
    round: "1ière Journée"
    score_eq1: null
    score_eq2: null
    ...
    }...]
    J'ai bien tenté un truc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var term = 'Ligue 1 2ième';
    var matchValue;
    var searchKeywords = term.split(' ');
    searchKeywords = searchKeywords.map(val => { return val.toString().toLowerCase();});
            var filtered = json.filter(item => {            
                matchValue = 0;            
                searchKeywords.forEach(function (word) {
                    matchValue = matchValue +  (item.eventname.toString().toLowerCase().includes(word) ||
                    item.round.toString().toLowerCase().includes(word) ||
                    item.eq1.toString().toLowerCase().includes(word) ||
                    item.eq2.toString().toLowerCase().includes(word)) ? 1 : 0;
                });           
                return (matchValue === searchKeywords.length)
            });
    Ce n'est pas tout à fait correct.

    - Si la recherche comporte un espace (ça ne doit pas poser problème au final)
    - Si ça matche plus que le nombre de terms

    Il faut être certains que TOUS les mots (term) sont là au minimum une fois pour valider la recherche

    Pour une recherche "2ième" => OK
    Pour une recherche Ligue 1 > NOK Le 1 pose problème ??!!

    Merci de ton aide encore !

    Coincoin22

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 847
    Points
    4 847
    Par défaut
    Salut,

    J'ai vu que ton code est un peu long...

    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
     
    let json=
    [{...}...],
    term="Ligue ière".split(" "),
    searchKeywords=term,
    matchValue,
    result=json.filter((elem,index)=>{
        matchValue=0;
        searchKeywords.map((v)=>{
         matchValue+=( elem.eq1.includes(v)
              || elem.eq2.includes(v)
              ||elem.eventname.includes(v)
              ||elem.round.includes(v))?1:0;
        });
      return matchValue==searchKeywords.length;
    });
    console.log(result);
    Edit : sans trop de parenthèses, ça donne ça.

  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
    Merci Toufik,

    Ce n'est pas tout à fait ce que je veux... Il faut que TOUS les mots clés soient dans l'item pas un ou plusieurs.

    Sur mon code, il manquait une parenthèse avant item et après 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    searchKeywords.forEach(function (word) {
                    matchValue = matchValue +  ((item.eventname.toString().toLowerCase().includes(word) ||
                    item.round.toString().toLowerCase().includes(word) ||
                    item.eq1.toString().toLowerCase().includes(word) ||
                    item.eq2.toString().toLowerCase().includes(word)) ? 1 : 0);
                });
    ça fait le job !
    Merci les amis !

    A+
    Coincoin22

  6. #6
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Points : 2 006
    Points
    2 006
    Billets dans le blog
    1
    Par défaut
    Je n'ai pas compris le tiers de ce que tu as raconté mais heureuse que ça marche pour toi

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

Discussions similaires

  1. [AJAX] Filtrer un objet Json
    Par chok71 dans le forum jQuery
    Réponses: 0
    Dernier message: 04/09/2014, 15h59
  2. [POO] Objet json , comment instancier un nouvel objet ?
    Par le_chomeur dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 29/10/2008, 10h19
  3. retourner objet Json via ajax ? hmm
    Par Myfred dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 25/06/2008, 11h06
  4. [POO] Restaurer un objet JSon en javascript
    Par GandalfZeGrey dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 21/01/2008, 15h14
  5. [POO] lecture objet json
    Par taouja dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/12/2007, 11h32

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