tri tableau associatif JavaScript

tri tableau associatif JavaScript - HTML/CSS - Programmation

Marsh Posté le 26-10-2012 à 20:31:32    

Bonjour
 
J'ai une carte avec des marqueurs, chaque marqueur a un score et les 10 meilleurs ont un cercle de taille croissante (et une variation de couleur)
 
Pour un code identique, j'ai un comportement différent entre Chrome et Firefox/Safari suite au tri d'un tableau associatif
 
Je suis parti de l'adaptation de la fonction arsort
https://github.com/phpjs/phpjs/blob [...] /arsort.js
 
Ma version épurée

Code :
  1. var scores = {};
  2. var converted_scores = [];
  3. var sorted_scores = {};
  4.         var total_markers = map_markers.length;
  5. for(i=0;i<total_markers;i++) {
  6.  scores[i] = map_markers[i].score;
  7. }
  8. for(k in scores) {
  9.  converted_scores.push([k, scores[k]]);
  10. }
  11. sorter = function(b, a) {
  12.  return a > b ? 1 : a < b ? -1 : 0;
  13. };
  14. converted_scores.sort(function(a, b) {
  15.  return sorter(a[1], b[1]);
  16. });
  17. total_converted_scores = converted_scores.length;
  18. for(i=0;i<total_converted_scores;i++) {
  19.  sorted_scores[converted_scores[i][0]] = converted_scores[i][1];
  20. }
  21. var rank = 1;
  22. for(i in sorted_scores) {
  23.  if(map_markers[i]._latlng.lat <= bounds._northEast.lat && map_markers[i]._latlng.lat >= bounds._southWest.lat && map_markers[i]._latlng.lng <= bounds._northEast.lng && map_markers[i]._latlng.lng >= bounds._southWest.lng) {
  24.   if(rank <= 10) {
  25.    debug(rank + ': ' + map_markers[i].score);
  26.    map_markers[i].rank = rank;
  27.    map_setcircle(map_markers[i]._latlng.lat, map_markers[i]._latlng.lng, rank);
  28.   }
  29.   rank++;
  30.  }
  31. }


 
Je ne vois pas ce qui peut gêner avec Chrome (à part un bug connu, ou une sensibilité avec une conversion de format) ??
 
A gauche sur Chrome KO
Au milieu sur Firefox OK
A droite sur Safari OK
 
http://sdion.net/scores-compare.png


Message édité par ceam le 26-10-2012 à 21:03:09
Reply

Marsh Posté le 26-10-2012 à 20:31:32   

Reply

Marsh Posté le 26-10-2012 à 20:47:41    

c'est particulier comme approche pour trier quand meme

 

pourquoi tu ne fais pas quelqlue chose comme ça

Code :
  1. var tab =[{a:1, score:3} ,{a:6, score:2} ,{a:2, score:4} ,{a:7, score:9} ];
  2. tab.sort(function(a,b){return b.score-a.score});
  3. var index = 0 ;
  4. while(index < 10 && index < tab.length){
  5.     //la tu bosses avec tes 10 meilleurs marqueurs
  6. }


Je ne suis pas sur que partir de phpjs soit le meilleur choix que tu puisse faire


Message édité par flo850 le 26-10-2012 à 20:54:27

---------------

Reply

Marsh Posté le 26-10-2012 à 21:01:13    

A vrai dire je fais beaucoup plus de php front/back normalement
 
En Javascript ponctuellement il y a des fonctions qui me prendrait trop de temps à refaire
 
Je vais regarder le code

Reply

Marsh Posté le 26-10-2012 à 21:12:10    

Ca c'est vu [:cupra]

 
Code :
  1. map_markers.sort(function(a,b){return b.score-a.score});
  2. var rank ;
  3. var total_markers = map_markers.length;
  4. for(rank = 0 ; rank< 10 && rank< total_markers ; rank ++){
  5.   debug(rank + ': ' + map_markers[i].score);
  6.   map_markers[rank].rank = rank;  //pas sur que ce soit très utile, a voir suivant la suite de tes traitements
  7.   map_setcircle(map_markers[i]._latlng.lat, map_markers[i]._latlng.lng, rank);
  8. }


C'est quand même plus concis


Message édité par flo850 le 26-10-2012 à 21:13:40

---------------

Reply

Marsh Posté le 26-10-2012 à 21:32:17    

c'est beaucoup mieux merci  [:ceam]  
 
je mettais embêté à faire un tableau intermédiaire alors qu'il suffisait de trier le premier tableau (contenant des objets)


Message édité par ceam le 26-10-2012 à 21:53:29
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed