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 :

Gestion d'objet à 2 key identique


Sujet :

JavaScript

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347
    Par défaut Gestion d'objet à 2 key identique
    Bonjour à tous,

    [INTRO]
    J'avais fais un script simple et qui fonctionnait très bien se basant sur les key=>value. Mon script n'a aucune prétention, il ne gère pas de flux boursier, je suis à la base pas développeur JS mais le script fait bien le job.
    Mais malheureusement je dois désormais introduit des key identiques et tout mon script tombe à l'eau.
    Je sais pas comment le modifier, voir le refaire.

    [DETAIL]
    Le contexte étant très très compliqué à la base, je l'ai volontairement très adapté et simplifié par soucis de compréhension et d'une meilleur lisibilité. On va donc parler ici de bonbon et de viande

    Je possède une liste de produit à blacklister suivant des caractéristiques spécifiques.
    Il y a le "type" qui constitue la key ex:"bonbon". et la valeur associée : un code (non utilisé dans l'exemple mais normalement il l'ai) et l'origine (ex: Chine). (note: les string sont fortement normés)
    Le principe est simple: Si on soumet un produit qui répond aux caractéristiques, la fonction retourne true: il est blacklisté.Exemple le bonbon vient de chine, il est blacklisté.

    Le code est très simple. je regarde si il existe une key de la blacliste identique au type du produit donné. Si oui, je teste si l'origine est identique.


    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
     
    let blacklist = {
    	"bonbon": [1,"Chine"],
    	"viande": [4,"Angleterre"],
    	"lait": [2,"Chine"],
    	 "tomate": [4, "Egypte"]
    }
     
    function checkBlacklist(produit, origine) {
    	if (blacklist.hasOwnProperty(produit)){
    		[codeBlacklisted, origineBlacklisted] = blacklist[produit];
    		if(origineBlacklisted == origine){
    			return true;
    		}
    	}
    	return false;
    }
    console.log("blacklister ? " +  checkBlacklist("bonbon", "chine"));
    Maleureusement, des nouvelles régles de blackliste viennent d'arriver. La voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    let blacklist = {
    	"bonbon": [1,"Chine"],
    	"bonbon": [1,"Vietnam"],
    	"viande": [4,"Angleterre"],
    	"lait": [2,"Chine"],
    	"tomate": [4, "Egypte"]
    }
    Vous voyez le problème. il y a 2 key identique. Le bonbon du vietnam écrase la regle du bonbon de chine, qui est alors plus détecté.
    Je ne peux toucher le champ "origine" qui ne peut contenir que un seul pays.
    Mais je peux changer toute la structure de la blackliste tant qu'on modifie pas les données (champ type, code et origine).
    Si vous avez une idée pour adapter mon script pour qu'il fonctionne de nouveau, je vous remercie par avance.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 661
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 661
    Par défaut
    une idée qui fonctionne souvent pour moi quand je me demande comme structurer cela est que je fais le parallèle avec la structure d'une table dans un SGBD.
    là pour stocker ces éléments à refuser, je mettrais les champs suivants :
    • code aliment
    • numero mystere
    • code pays



    et donc en javascript, vous pouvez faire par exemple une liste d'objets comme cela :
    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
    [
    	{
    		"code_aliment" : "bonbon",
    		"numero_mystere" : "1",
    		"code_pays" : "chine",
    	},
    	{
    		"code_aliment" : "bonbon",
    		"numero_mystere" : "1",
    		"code_pays" : "Vietnam",
    	},
    	{
    		"code_aliment" : "viande",
    		"numero_mystere" : "42",
    		"code_pays" : "angleterre",
    	},
    	{
    		"code_aliment" : "lait",
    		"numero_mystere" : "6",
    		"code_pays" : "chine",
    	},
     
    ]

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Autre idée: tu as le droit d'ajouter une origine à ta clé "pays", ce qui te donnes un tableau;

    http://javatwist.imingo.net/blackl.htm

    C'est un schéma naïf (aucun contrôle, etc. Normalement il faudrait une liste html générée à partir de l'objet "list");

    Code html : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8"> 
    <title>...</title>
    <style>
    </style>
     
    </head>
    <body>
    <pre id="avant"></pre>
    <input type="text" placeholder="Type de produit" id="t" />
    <input type="text" placeholder="Origine" id="o" />
    <input type="button" value="blacklister" id="v" />
    <input type="button" value="ajouter" id="safe" />
    <pre id="apres"></pre>
     
    <script>
     
    // produits disponibles
    const list = {
            "bonbon": {
                    "code":1,"pays":[
                            "Chine","Vietnam","Paraguay"
                    ]
            },
            "viande": {
                    "code":4,"pays":[
                            "Angleterre","Pérou","Tunisie"
                    ]
            }
    }
     
    // affichage tableau produits
    document.getElementById("avant").textContent=JSON.stringify(list,null,2)
     
    // bouton blacklist et fonction
    document.getElementById("v").addEventListener("click",()=>
            black(document.getElementById("t").value,document.getElementById("o").value)
    )
     
    const black=((t,o)=>{
            if(list[t]){
                    const ind=list[t].pays.indexOf(o);
                    if(ind!=-1){
                            list[t].pays.splice(ind,1)
                    }
            }
            document.getElementById("apres").textContent=JSON.stringify(list,null,2)
     
    })
     
    // bouton ajouter (déblacklister, par exemple)  et fonction
    document.getElementById("safe").addEventListener("click",()=>
            white(document.getElementById("t").value,document.getElementById("o").value)
    )
     
    const white=((t,o)=>{
            if(list[t]){
                    const ind=list[t].pays.indexOf(o);
                    if(ind==-1){
                            list[t].pays.push(o)
                    }
            }
            document.getElementById("apres").textContent=JSON.stringify(list,null,2)
     
    })
     
    </script>
    </body>
    </html>

    Ici, tu vois la liste modifiée, pas la blacklist, mais c'est idem;

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Est ce qu'un produit peut être associé plusieurs fois au même pays mais avec un code mystère différent?


    Tu peux faire comme ça:
    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
    let blacklist = new Map([
        [ 'bonbon', [{ code: 1, origine: 'Chine' }, { code: 1, origine: 'Vietnam' }] ],
        [ 'viande', [{ code: 4, origine: 'Angleterre' }] ],
        [ 'lait',   [{ code: 2, origine: 'Chine' }] ],
        [ 'tomate', [{ code: 4, origine: 'Egypte' }] ]
    ]);
     
    function checkBlacklist(produit, origine) {
        if ( blacklist.has(produit) ) {
            for (const item of blacklist.get(produit)) {
                if ( item.origine === origine )
                    return true;
            }
        }
        return false;
    }
     
     
    console.log(`blacklister ? ${checkBlacklist("bonbon", "Chine")}`);
    Est ce qu'un produit peut être associé plusieurs fois au même pays mais avec un code mystère différent?

    Car si non tu peux faire une structure de données qui évite la boucle.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347
    Par défaut
    Et bien un grand merci à tous.
    C'est top, je m'attendais pas à temps de réponses et aussi rapidement.


    Pour répondre à tout le monde :
    @mathieu : Oui c'est exactement ce sur quoi je pensais. Encapsulé tout mes produits dans une liste. Ce qui m'embêtais c'est que je devais faire une boucle, et je pensais, réutiliser la même structure ( {"bonbon": [1,"Chine"]}, {"viande": [4,"Angleterre"]}, mais je me suis rendu compte qu'on peut pas directement récupérer une clef d'un objet si on la connait pas. Donc j en étais revenu au même conclusion que toi. rajouter des labels à chaque valeur. Ce qui est en soit plus propre mais qui alourdi un peu mon code, et ma structure. Et j'ai aussi plus de mal à le coder, je suis pas à l'aide avec les for each/in etc... :p Mais c'est claire, c'est une solution pas mal !

    @javatwister à vrai dire j'y avais pas pensé, mais c'est une très bonne idée. juste les codes sont liés au pays. mais l'ajustement est pas compliqué. T'as été même bien au delà puisque tu as fait l'ajout et la suppression Merci bcp c'est top. Je connais pas non plus : JSON.stringify merci

    @CosmoKnacki avec le retour de javatwister et ton ajustement, c'est exactement le combo/ l'idée que j'espérais. Je trouve ca déforme pas trop mon code et ca reste très optimisé car on réduit le nombre itération sur la liste, ca se code facilement (disons c'est à ma porté), tout en répondant parfaitement à mon besoin. Merci.

    Par contre 2 questions:
    - J'avais hésité à transformer ma liste en Map mais j'ai pas spécialement vu d'avantage significatif dans mon cas. Par curiosité, c'est juste pour exploiter une struture dédié à ca mais napprote pas spécialement plus ou il y a un rellement avantage ?
    - console.log(`blacklister ? ${checkBlacklist("bonbon", "Chine")}`); : je connais pas la notation `${xx}`, tu peux m'en dire plus ? J'avais en plus essayer de l'exploiter en dehors d'un consolelog mais ca na pas marché.

    Un grand merci à tous en tout cas. Je passe le ticket à réolu grace à vous tous.

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

Discussions similaires

  1. [RMI]Gestion des objets sur le serveur?
    Par fabszn dans le forum Langage
    Réponses: 9
    Dernier message: 06/06/2007, 11h59
  2. Algorithme de gestion d'objets multiples
    Par aderdu91 dans le forum Développement 2D, 3D et Jeux
    Réponses: 9
    Dernier message: 18/04/2007, 22h11
  3. Pb de gestion des objets Excel
    Par tedparker dans le forum Access
    Réponses: 2
    Dernier message: 11/09/2006, 17h13
  4. gestion collision objet
    Par karasnake dans le forum Flash
    Réponses: 2
    Dernier message: 14/06/2006, 08h54
  5. Réponses: 9
    Dernier message: 30/03/2006, 20h16

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