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 :

Retrouver l'index d'un objet plac� dans un array


Sujet :

JavaScript

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Par d�faut Retrouver l'index d'un objet plac� dans un array
    Bonjour,

    * J'ai une liste d'ID (un par client) et � chaque client est associ� plusieurs marqueurs sur une carte leaflet.

    * Je parcours la base de donn�e, trouve quel est le plus grand ID, et cr�e une markerMap (tableau � 2 dimensions) o� je pourrai associer IDs et marqueurs :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    var markerMap = new Array( <?php include('get_maxId.php');?> ); // pour les IDs des clients
    for (i=0;i<markerMap.length;i++)
    	{
    	markerMap[i] = new Array(); // ici on mettra les IDs des marqueurs de chaque client (nombre indéterminé)
    };
    * Ensuite je r�cup�re en base de donn�es le nombre d'IDs et le nombre de marqueurs associ�s � chaque ID (qui est variable d'un client � l'autre) et fais 2 boucles imbriqu�es pour parcourir les IDs et leurs marqueurs associ�s :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //php pour récupérer en bdd et qui retourne un objet JSON (accessible ds la boucle via data[i]), puis :
    for (var i = 0; i < data.length; i++) { // boucle sur les IDs
       var combien_marqueurs = data[i].combien_marqueurs;
       var pseudoId = data[i].id;
     
       for (var j = 1; j <= combien_stories; j++) { // boucle sur les marqueurs
       //... 
       }
    }
    *** Mon probl�me est dans cette 2�me boucle :
    Dans cette boucle, je cr�e les marqueurs et les rentre dans la markerMap pour pouvoir les manipuler ensuite :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    eval('markerMap[clientId]['+j+'] = marker');
    Tout va bien, le j est bien pris en compte. Mais, ensuite, j'utilise une fonction pour enregistrer la position des marqueurs dans la bdd lorsqu'ils sont d�plac�s sur la carte (on dragend) :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    marker.on('dragend', function(event) {
    	var result = this.getLatLng();
    	var lati = result.lat;
    	var longi = result.lng;
    	$.post('set_position_marqueur.php', { marqueurId: j, latitude: lati, longitude: longi});
    });
    Et l�, bien s�r, c'est le drame! Lorsqu'on drag un marqueur la 2�me boucle en j++ est finie depuis longtemps et je ne peux enregistrer en base que le dernier marqueur de chaque utilisateur. Bien s�r �a fonctionne si je met le num�ro du marqueur en dur, mais j'aimerai �viter :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    if (j==1){	marker.on('dragend', ... $.post('set_poi.php', { marqueurId: 1, latitude: lati, longitude: longi}); }
    if (j==2){	marker.on('dragend', ... $.post('set_poi.php', { marqueurId: 2, latitude: lati, longitude: longi}); } 3,4,5 etc.
    >>> QUESTION :
    Y a-t-il un moyen de retrouver depuis le marqueur sa place dans la markerMap afin de savoir si on est en train de manipuler le marqueur 1, le 2, le 3... Pour l'id du client, je me sers d'une variable session_id, donc pas de soucis.

    Je voudrais donc juste trouver markerMap[clientId][�a]
    parser le tableau? faire une sorte de tableau reverse (je l'avais fait en flash)? cr�er une autre var qui stocke la "vraie" valeur de j? ou autre?

    merci bcp!

  2. #2
    Expert confirm�
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par d�faut
    � deux heures du mat' comme �a j'ai peut-�tre pas tout saisi mais j'ai l'intuition que tu as besoin de indexOf ou lastIndexOf.

    Et puis j'ai vu cette horreur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    eval('markerMap[clientId]['+j+'] = marker');
    Je vois pas l'int�r�t du eval ici. Toujours �viter eval quand on peut. Il y a des ressources sur ce site qui expliquent pourquoi, fais une petite recherche
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    markerMap[clientId][j] = marker;
    �a marche pas simplement comme �a ?
    La FAQ JavaScript � Les cours JavaScript
    Touche F12 = la console → l�outil indispensable pour d�velopper en JavaScript !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Par d�faut
    Merci de t'int�resser � mon probl�me. A cette heure, on ne voit plus clair

    Effectivement eval ne servait � rien. Je l'avais cru utile en d�sespoir de cause alors que le probl�me venait d'ailleurs s�rement. Merci!

    C'est une question de s�curit� c'est �a (injection de code) ? Si on ne peut s'en passer mais que les donn�es ne viennent pas d'un champs input, c'est pas trop grave?
    Je fais des appels � la bdd apr�s, mais j'ai fait des requ�tes pr�par�es (d'apr�s ce que j'ai lu, �a �vite les injections)

    Par ailleurs, merci pour indexOf �a va s�rement le faire! Par contre, je lis que c'est incompatible avec IE < 9...
    Il va peut-�tre falloir que je code en dur alors...

    Bonne nuit!

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Par d�faut
    Merci pour indexOf, je ne savais pas que �a marchait pour les tableaux. J'ai fait �a et �a roule :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    marker.on('dragend', function(event) {
    	var result = this.getLatLng();
    	var lati = result.lat;
    	var longi = result.lng;
    	var marqueurId = markerMap[sessionId].indexOf(this); // sessionId = clientId en réalité // >>> OK mais pas sur IE8
    	$.post('set_position_marqueur.php', { marqueurId: marqueurId, latitude: lati, longitude: longi});
    });
    Alors pour IE8, j'ai tout essay� (y compris des boucles dans la boucle etc...), pas moyen de sauvegarder ce j de la boucle qqe part pour le retrouver ensuite... Sinon j'ai trouv� une r��criture de la fonction indexOf pour �tre compatible IE8, je ne sais pas si �a peut fonctionner.

    Mais j'aurais peut-�tre d� faire un tableau � base de propri�t�s?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //A la place de : 
    markerMap[clientId][numéro du marker] = marker
    //Faire : 
    var markerMap[clientId]= [
            {
                'latitudeMarker1':'35.000000',
                'longitudeMarker1': '56.000798',
            },
            {
                'latitudeMarker2':'35.000000',
                'longitudeMarker2': '56.000798',
            }, etc....
    ];
    Aurais-ce �t� mieux? Sachant que je ne sais pas � l'avance le nombre de clients ni le nombre de markers par client, comment d�clarer �a?

  5. #5
    Expert confirm�
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par d�faut
    Le code de remplacement que tu as trouv� sur JDN s'appelle un polyfill. Il y en a un plus efficace et plus robuste sur le MDN.

    Pour eval je pense que tu confonds injections XSS et injections SQL. Ce n'est pas le m�me champ de bataille (si tu vois ce que je veux dire) : une XSS attaque le visiteur, une injection SQL attaque la base de donn�es.
    Mais pour moi, eval c'est surtout un probl�me d'efficacit� : normalement, tout le code source JavaScript est interpr�t� avant l'ex�cution ; avec eval, le moteur d'ex�cution est oblig� de rappeler l'interpr�teur, ce qui peut causer un ralentissement.

    Le � tableau � base de propri�t�s � c'est aussi une bonne id�e Mais pourquoi pas un objet anonyme tout simplement ? Tu peux le d�clarer vide pour commencer :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    var markerMap[clientId] = {};
    Gr�ce � �a tu n'as pas besoin de conna�tre � l'avance le nombre de clients. Et apr�s :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    markerMap[clientId].latitudeMarker1 = '35.000000';
    markerMap[clientId].longitudeMarker1 = '56.000798';
    markerMap[clientId].latitudeMarker2 = '35.000000';
    markerMap[clientId].longitudeMarker2 = '56.000798';
    // etc.
    Ou avec la syntaxe des crochets :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    markerMap[clientId]["latitudeMarker1"] = '35.000000';
    markerMap[clientId]["longitudeMarker1"] = '56.000798';
    markerMap[clientId]["latitudeMarker2"] = '35.000000';
    markerMap[clientId]["longitudeMarker2"] = '56.000798';
    // etc.
    Cette derni�re syntaxe te permet de g�rer dynamiquement tes noms de variables : faire des trucs du genre markerMap[clientId]["latitudeMarker" + j].

    Mais l'important c'est d'avoir des structures de donn�es simples et coh�rentes. En l'occurence, tu peux d�cider qu'un marqueur c'est un tableau � deux cases (latitude et longitude), ou alors un objet avec une propri�t� latitude et une propri�t� longitude. Et du coup, tu stockes des tableaux de marqueurs, ce qui ressemble donc � �a :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    markerMap[clientId] = [
      ['35.000000', '56.000798'], // marqueur 0
      ['35.000000', '56.000798'], // marqueur 1
    ];
    Ou

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    markerMap[clientId] = [
      { latitude: '35.000000', longitude: '56.000798' }, // marqueur 0
      { latitude: '35.000000', longitude: '56.000798' }, // marqueur 1
    ];
    Un peu comme tu as fait, mais la diff�rence c'est que les noms de propri�t�s sont les m�mes ce qui est bien plus pratique !
    Et pour y acc�der (suppose que tu as une variable markerId contenant 0 par exemple) :
    • si tu as choisi des tableaux � deux cases, markerMap[clientId][markerId][0] pour la latitude et markerMap[clientId][markerId][1] pour la longitude ;
    • sinon, simplement markerMap[clientId].latitude et markerMap[clientId].longitude.

    Quand j'ai � choisir une repr�sentation de structures comme ici, en g�n�ral je pr�f�re des noms plut�t que des tableaux. C'est un peu plus long, mais tellement plus lisible
    La FAQ JavaScript � Les cours JavaScript
    Touche F12 = la console → l�outil indispensable pour d�velopper en JavaScript !

  6. #6
    Mod�rateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par d�faut
    Bonjour,
    peut �tre n'ai je pas compris ton probl�me, mais je me risque.
    en utilisant un objet markerMap ={}, � la cr�ation des marker on initialise de telle sorte � avoir une liaison � "double sens"

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    le_nouveau_marker.clientId = clientId;     // ajout propriété au marker
    le_nouveau_marker.clientIndex = i;         // si vraiment nécessaire
    markerMap[clientId].push( le_nouveau_marker);
    de telle sorte que tu peux obtienir directement sa position, si n�cessaire.

    et dans ta fonction plus de soucis de r�cup�ration des donn�es
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    marker.on('dragend', function(event) {
    	var result = this.getLatLng();
    	var lati   = result.lat;
    	var longi  = result.lng;
    	var client = this.clientId;    
    	var index  = this.clientIdIndex;    
    	// la suite...de ton besoin     
    });

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [2.x] Retrouver l'objet User dans un form de FosUserBundle
    Par DanaKil dans le forum Symfony
    R�ponses: 0
    Dernier message: 18/05/2015, 13h30
  2. Agir sur des objets plac�s dans un tableau
    Par CyrilD dans le forum G�n�ral VBA
    R�ponses: 2
    Dernier message: 27/03/2011, 22h06
  3. Retrouver l'index d'un(e) Item cliqu� dans un ListBox
    Par Claude_Azoulai dans le forum VB.NET
    R�ponses: 2
    Dernier message: 01/02/2010, 12h10
  4. [Vb.net] Index� un objet cr�e dans une boucle
    Par picpic dans le forum Windows Forms
    R�ponses: 10
    Dernier message: 17/12/2003, 14h37
  5. R�ponses: 3
    Dernier message: 09/02/2003, 01h09

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