Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/04/2011, 18h52   #1
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
Par défaut Tri Array Multidim. avec valeurs égales

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
function tri( a, b )
{
 
//return a[0] - b[0];
//ou
 
var v1 = parseInt(a[0]);
var v2 = parseInt(b[0]);
if ( v1 < v2 ) return -1;
if ( v1 > v2 ) return 1;
return 0;
 
}
Mon problème:
un tableau trié sur une clé ayant des valeurs égales ne se tri pas correctement. Souvent la clé du milieu (c'est à dire ayant pour indice la moitié du nombre d'entrées) se retrouve en tête du tableau et le reste inchangé.

Ex:

tableau initial

0 => 0
1 => 0
2 => 0
3 => 0
4 => 0
5 => 0
6 => 0
7 => 0
8 => 0
9 => 0
10 => 0

devient

5 => 0
0 => 0
2 => 0
3 => 0
4 => 0
1 => 0
6 => 0
7 => 0
8 => 0
9 => 0
10 => 0

Merci pour votre aide.
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 11h00   #2
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 074
Points : 4 074
Heu... deux choses que je ne comprends pas à la lecture de ton post :

- pourquoi parler de tableau multidimensionnel ?

- quel est le problème exactement... ? Les indices sont numériques et non pas des chaines, donc "après tri" sur un tableau dont toutes les valeurs sont à 0, le tableau a la même longueur, des indices numériques... il est identique au tableau avant le tri.... non ? A quel niveau est-ce que ça pose problème ?
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 12h33   #3
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
Citation:
Envoyé par RomainVALERI Voir le message
Heu... deux choses que je ne comprends pas à la lecture de ton post :
- pourquoi parler de tableau multidimensionnel ?
Tableau multidimensionnel car ... c'est l'une des utilisations spécifique à la fonction personnalisé dans un tri. Lors d'une récupération des éléments d'une BDD j'ai un tableau contenant les n entrées de ma BDD, où chacune correspond à un nouveau tableau avec toutes ses colonnes (nom, prénom, age, ...). D'où l'utilisation d'une fonction personnalisé pour faire un tri sur une colonne spécifique.

Citation:
Envoyé par RomainVALERI Voir le message
- quel est le problème exactement... ? Les indices sont numériques et non pas des chaines, donc "après tri" sur un tableau dont toutes les valeurs sont à 0, le tableau a la même longueur, des indices numériques... il est identique au tableau avant le tri.... non ? A quel niveau est-ce que ça pose problème ?
Je reprends mon exemple précédent d'exploitation d'une BDD. Disons que nous avons :
table[0]["sexe"] = masculin
table[0]["prenom"] = jimmy
table[0]["age"] = 30
table[1]["sexe"] = masculin
table[1]["prenom"] = romain
table[1]["age"] = 30
table[2]["sexe"] = masculin
table[2]["prenom"] = bob
table[2]["age"] = 30
Avec un tri sur l'âge (valeur numérique) le tableau ne devrait pas changer d'état ... puisque pour les 3 entrées l'âge est égal à 30.
OR il se trouve qu'à partir d'un certain nombre d'entrée; le tableau change d'ordre.
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 13h56   #4
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 074
Points : 4 074
Bon, ça se précise mais... pas encore tout-à-fait

La seconde "dimension" de ton tableau est basée sur des indices numériques (ce qui, en effet, suite au comportement que tu signales, pourrait poser problème) ? Ou bien sur des clefs sous formes de chaines (le principe du tableau associatif ou hash, en fait), comme dans l'exemple que tu donnes ici :
Citation:
table[0]["sexe"] = masculin
table[0]["prenom"] = jimmy
table[0]["age"] = 30
table[1]["sexe"] = masculin
table[1]["prenom"] = romain
table[1]["age"] = 30
table[2]["sexe"] = masculin
table[2]["prenom"] = bob
table[2]["age"] = 30
?

Parce que je ne vois pas en quoi l'extrait ci-dessus est différent de :
Citation:
table[0]["sexe"] = masculin
table[0]["age"] = 30
table[0]["prenom"] = jimmy
table[1]["prenom"] = romain
table[1]["sexe"] = masculin
table[1]["age"] = 30
table[2]["age"] = 30
table[2]["sexe"] = masculin
table[2]["prenom"] = bob
?

Tu accèdes aux éléments de la même manière avant et après traitement, donc le problème n'est pas ici mais en aval, dans un traitement que tu dois faire après cette étape, j'imagine... ^^

>>> Dis-nous ce que tu veux faire avec le tableau "trié" mais qui ne fonctionne pas (affichage, calcul, etc.)
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 14h14   #5
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
C'est bien au premier niveau, c'est à dire dans le tableau principal, celui que je veux trier en fait, que ce passe mon problème.

table[0]["sexe"] = masculin
table[0]["prenom"] = jimmy
table[0]["age"] = 30
table[1]["sexe"] = masculin
table[1]["prenom"] = romain
table[1]["age"] = 30
table[2]["sexe"] = masculin
table[2]["prenom"] = bob
table[2]["age"] = 30
...

en triant table par rapport à l'âge des entrées (sous tableaux), en ayant tout les âges identiques, le tableau ne devrait pas bouger. En fait je me retrouve avec par exemple:

table[0]["sexe"] = masculin
table[0]["prenom"] = romain
table[0]["age"] = 30
table[1]["sexe"] = masculin
table[1]["prenom"] = bob
table[1]["age"] = 30
table[2]["sexe"] = masculin
table[2]["prenom"] = jimmy
table[2]["age"] = 30
...
?

Les valeurs, entrées, ou bien encore sous tableaux comme vous voulez, ont changé d'indice. Pourquoi?
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 15h00   #6
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 074
Points : 4 074
Je crois qu'il faudrait voir un peu de code pour s'y retrouver : montre-nous comment est appelée ta fonction de tri, avec un peu de contexte si possible
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 15h11   #7
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
Hum... Je pensais que c'était plutôt clair

Exemple
Code :
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
function tri( a, b )
{
	return a[1] - b[1];
 
	//ou
    //var v1 = parseInt(a[1]);
	//var v2 = parseInt(b[1]);
	//if ( v1 < v2 ) return -1;
	//if ( v1 > v2 ) return 1;
	//return 0;
}
 
var t = new Array();
 
for(i=0; i<11; i++)
{
t[i] = new Array();
t[i][0] = i;
t[i][1] = 0;
}
 
for(i=0; i< t.length; i++) 
{ 
document.writeln(t[i][0] + " => " + t[i][1] + "<br>");
}
 
t.sort(tri);
 
for(i=0; i< t.length; i++) 
{ 
document.writeln(t[i][0] + " => " + t[i][1] + "<br>");
}
Résultat
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
0 => 0
1 => 0
2 => 0
3 => 0
4 => 0
5 => 0
6 => 0
7 => 0
8 => 0
9 => 0
10 => 0
5 => 0
0 => 0
2 => 0
3 => 0
4 => 0
1 => 0
6 => 0
7 => 0
8 => 0
9 => 0
10 => 0
Merci pour votre attention
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 15h21   #8
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 756
Points : 4 756
Bonjour à tous,
une chose me chagrine dans ce qui est fait...
...tri sur un tableau d'objet!
Code :
1
2
3
table[0]["sexe"] = masculin
table[0]["prenom"] = jimmy
table[0]["age"] = 30
table est un tableau de tableau associatif, donc d'objet équivalent à
Code :
1
2
3
table[0].sexe = 'masculin';
table[0].prenom = 'jimmy';
table[0].age = 30;
lorsque l'on appelle, je présumes
la fonction attend en paramètre des éléments du tableau soit la première fois table[0] et table[1]

dans la fonction on a donc ces éléments sous référence a et b, et dans ce cas utiliser a[0] et b[0] reviens à utiliser table[0][0] et table[1][0].
comme table[0], et les autres, pointe sur un tableau associatif table[0][0] est undefined.

Il te faut utiliser dans la fonction a.age ou encore a['age']

Code :
1
2
3
4
5
6
7
8
9
function tri( a, b ){ 
  //return a[0] - b[0];
  //ou 
  var v1 = parseInt(a['age']); // possible
  var v2 = parseInt(b.age);    // autre possibilite
  if ( v1 < v2 ) return -1;
  if ( v1 > v2 ) return 1;
  return 0;
}
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/04/2011, 20h05   #9
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22

Tableau d'objets ? ... Hum ... un tableau est objet. Donc tableau de tableaux ou tableau d'objets ... c'est ... pareil non ?

Cependant pour la deuxième partie vous avez tout à fait raison, j'ai recopié et simplifié mon code un peu vite. Comme je le disais avant j'utilise de champs différents en fonction du remplissage de ma base de données. Faire ce tri avec a["age"] et b["age"] ne change pas le problème. Si les âges sont égaux le tri présente l'erreur citée plus haut. Je vais réécrire mon exemple...
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 20h10   #10
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
Exemple
Code :
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
function tri( a, b )
{
	return a["age"] - b["age"];
 
	//ou
    //var v1 = parseInt(a["age"]);
	//var v2 = parseInt(b["age"]);
	//if ( v1 < v2 ) return -1;
	//if ( v1 > v2 ) return 1;
	//return 0;
}
 
var t = new Array();
 
for(i=0; i<11; i++)
{
t[i] = new Array();
t[i]["id"] = i;
t[i]["nom"] = "nom" + i;
t[i]["age"] = 50;
}
 
for(i=0; i< t.length; i++) 
{ 
document.writeln(t[i]["id"] + " => " + t[i]["age"] + "<br>");
}
 
t.sort(tri);
 
for(i=0; i< t.length; i++) 
{ 
document.writeln(t[i]["id"] + " => " + t[i]["age"] + "<br>");
}
Résultat
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
0 => 50
1 => 50
2 => 50
3 => 50
4 => 50
5 => 50
6 => 50
7 => 50
8 => 50
9 => 50
10 => 50
 
5 => 50
0 => 50
2 => 50
3 => 50
4 => 50
1 => 50
6 => 50
7 => 50
8 => 50
9 => 50
10 => 50
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 15h10   #11
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 756
Points : 4 756
le résultat que tu obtiens est celui de CHROME, les autres navigateurs sur lesquels je viens de tester rendent unanimement le tableau inchangé, avec toutefois une différence de traitement notable quant à l'ordre de passage pour l'examen des éléments.

le script de test
Code :
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
 
var html = "<br>";
var i, count = 0;
var t = [];
 
function tri( a, b ){
  html += a["id"] + '->' + b["id"] +'<br>';
  count++;
  return a["age"] - b["age"];
}
 
for( i=0; i<11; i++){
  t[i] = [];
  t[i]["id"]  = i;
  t[i]["nom"] = "nom" + i;
  t[i]["age"] = 50;
}
 
t.sort(tri);
 
document.write( 'Tableau en sortie<br>');
for( i=0; i< t.length; i++){
  document.writeln(t[i]["id"] + " => " + t[i]["age"] + "<br>");
}
document.write( '<br>Appel fonction ', count, html);
on passe de 49 passages sous IE à 10 pour OPERA GOOGLE et FIREFOX, SAFARI ce distingue avec 29 passages, le plus savoureux étant que pas un n'a la même méthode de sélection des éléments à passer.

Si tu veux un rendu identique il va te falloir utiliser ta propre fonction maîtrisée
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/04/2011, 17h07   #12
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
Intéressant ... Je n'avais pas pensé à changer de navigateur ... je suis tellement content de Chrome... que j'en oublie les autres

Je développe sur Mac 10.6.7 et j'ai testé sous Chrome 11.0 Firefox 3.6 et Safari 5.0. J'ai effectivement noté la différence de passage à la fonction, ainsi que le résultat inattendu sous Chrome.

Au début je pensais à une différence de calcul; comme le modulo qui est affecté sur les grandes valeurs en fonction des mémoires. Mais là apparemment rien à voir.

Qu'entendez-vous par fonction maitrisée? Pensez-vous qu'une solution est envisageable?
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 18h30   #13
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 756
Points : 4 756
concernant CHROME, il rend un résultat identique sur des tableaux à 1 dimension ce qui ne convient donc pas dans ton cas.

Si il est important de conserver l'ordre original en cas d'égalité, ce qui est tout à fait louable, et compte tenu de la particularité de CHROME, il te faut peut être utiliser un tri simple par exemple
Code :
1
2
3
4
5
6
7
8
9
10
11
12
function fctTri( tab, param){
  var i, j, temp, nb = tab.length;
  for( i= 0 ; i < nb; i++){
    for( j = i+1; j < nb; j++){
      if( tab[j][param] < tab[i][param]){
        temp = tab[j];
        tab[j] = tab[i];
        tab[i] = temp;
      }
    }
  }
}
avec un appel du type
Code :
fctTri ( tableau, 'age'); // ou age est le champ a trier
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/05/2011, 10h23   #14
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
Par défaut RESOLU

Merci pour votre aide. Votre exemple m'a bien aidé à comprendre comment parvenir à mes fins.
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h23.


 
 
 
 
Partenaires

Hébergement Web