11548 sujets

JavaScript, DOM et API Web HTML5

Pages :
Bonjour,

j'ai une liste de variable dont la valeur peux changer à tout moment, genre :

a=2
b=6
c=1
d=8

Je voudrais savoir laquelle comporte le plus grand nombre. Comment faire ?

Merci de votre aide.
Modifié par cvneo (16 Oct 2010 - 14:09)
Hello @tous

Non Math.max évalue la plus grande valeur de deux nombres.

Exemple :


var a = 12;
var b = 8;
var c = 3;
var d = 29;
// -- Il n'y a que deux paramètres possible avec Math.max ( ) --
var resultat = Math.max(a, d); 
alert(resultat); // 29 etc.


++
Modifié par zardoz (14 Oct 2010 - 18:28)
Merci pour l'info.

J'ai trouvé sa du coup :

var array = [267, 306, 108];
var largest = Math.max.apply(Math, array);

Je vais tester ...

Bon j'ai testé, cela me donne bien le nombre le plus grand, mais j'ai besoin de savoir quelle variable a,b,c ou d est la plus grande Smiley decu

Cela fonctionne peux être via un tableau multidimensionnelle... ?
Modifié par cvneo (14 Oct 2010 - 18:58)
Pour une fois les tableaux peuvent être utiles !

var a=12;var b=8;var c=3;var d=29;
var t=[a,b,c,d].sort();
theBigOne=t[t.length-1];

Sans javascript ???
Merci c'est aussi une bonne solution, cela me donne bien le nombre le plus grand, mais j'ai besoin de savoir quelle variable a,b,c ou d est la plus grande, il est possible de connaitre la clé du tableau à la place de la valeur ?

Je dois faire cela en JS.

Si seulement foreach existait en JS ...
Modifié par cvneo (14 Oct 2010 - 19:11)
Alors, il faut faire le classement de t (par valeur décroissantes), dans le tableau u, en suivant les évolutions des rangs...
var a=2,b=9,c=7,d=1;
var t=[a,b,c,d],u=[],r=[];
for (j=0;j<t.length;j++) {
	k=j;while(0<k && u[k-1]<t[j]) {u[k]=u[k-1];r[k]=r[k--];}
	u[k]=t[j];r[k]=j;}
alert(u[0]+' '+r[0]);
Cela donne bien la valeur 9 avec son rang initial 1 qui devrait permettre de retrouver la variable b !
Juste une petite erreur dans le code ( --k et non k-- !)
var a=2,b=9,c=7,d=1; 
var t=[a,b,c,d],u=[],r=[]; 
for (j=0;j<t.length;j++) {
     k=j;while(0<k && u[k-1]<t[j]) {u[k]=u[k-1];r[k]=r[--k];}
     u[k]=t[j];r[k]=j;} alert(u[0]+' '+r[0]);
Allo

Ça donnait les mêmes résultats en bout de ligne : --k ou k-- // 9 1

Je l'ai essayé avec Object croyant pouvoir récupérer la propriété en string
la réponse est toujours numérique // 9 1 Je pense que le tableau multidimensionnel est la meilleur solution

var prop = new Object();
prop = { 'a' : 2, 'b' : 9, 'c' : 7, 'd' : 1 };
var t = [prop['a'], prop['b'], prop['c'], prop['d']], u = [], r = [];
for (j = 0; j < t.length; j++)
{
	k = j;
	while (0 < k && u[k-1] < t[j])
	{
		u[k] = u [k-1];
		r[k] = r[--k];
		u[k] = t[j]; 
		r[k] = j;
		}
	}
alert(u[0] + '\n ' + r[0]);


++
var x=new Array(2,6,1,8);
 var j=0;
 for(i=0;i<x.length;i++)
 {
 if(x[i]>x[j])
 j=i;
 }
 alert('Index : '+ j+' Valeur : '+x[j]);
[/i]

Plus concis, mais ça ne fait que trouver le max, sans trier les éléments.
Modifié par paolo (14 Oct 2010 - 22:29)
Salut @tous

@paolo : Il y a une erreur dans ton script. L'erreur est dans le conditionnel - if


var x = new Array(12,6,1,8);
var j = 0;
for(n = 0; n < x.length; n++)
 {
   // -- ici était l'erreur à cause du BBCode italic : la variable i avec crochet --
   if (x[n] > x[j])
   j = n;
 }
 alert('Index : ' + j + ' Valeur : ' + x[j]);


Bon je me rend compte que le « BBCode italic » empêche en même temps de rendre correctement le script. C'est pourquoi j'ai choisi la variable « n ». Il n'y avait donc pas d'erreur dans ton script. C'est un bug du programme d'Alsacréations qui rend mal l'écriture de script.

Oui ton script est plus concis. Seulement celui qui pose la question aurait voulu la clé plutôt que la valeur comme en PHP avec foreach. Là est la question et de quelle façon. Est-ce possible ?

++
Modifié par zardoz (15 Oct 2010 - 01:03)
@zardoz : Oui en bout de ligne pour l'exemple donné, mais l'édition du tableau (u) des valeurs triées et de la permutation des rangs (r) mettait en évidence le bug !

La méthode de tri consiste à remonter dans les valeurs déjà triées (les k premières) tant que la valeur à trier est plus grande que celles rencontrées. Il convient alors de décrémenter k lors de chaque décalage... et d'affecter la valeur à trier lorsque les décalages ne sont plus possibles (Achtung ! les deux denières instructions u[k] = t[j]; et r[k] = j; sont à exécuter lorsque le while n'est plus vérifié , il convient donc de les sortir des crochets correspondants !)

La méthode aboutit à un tableau des valeurs triées assorti de la permutration opérée sur les rangs. Ainsi avec a=2, b=9, c7, d=1 le tableau t devient u [9, 7, 2, 1] (les valeurs triées par ordre décroissant), celui des rangs r [1, 2, 0, 3] indique que la valeur placée en tête provient, avec des rangs d'origine 0, du rang 1 (b), la suivante du rang 2 (c), la troisième du rang 0 (a) et la quatrième du rang 3 (d). Ces indications devraient répondre à la question, ces rangs pouvant être utilisés simplement pour désigner les élements du tableau des noms des variables n= ['a','b','c','d']

Bonne continuation à tous...
Hello,

Ce n'est pas plus complique avec un objet :
var obj = {a: 2, b: 9, c: 7, d: 1}, maxKey;
for (var key in obj) {
  if (!maxKey || obj[ key] > obj[maxKey]) {
    maxKey = key;
  }
}

alert(maxKey + ": " + obj[maxKey]);

Modifié par Julien Royer (15 Oct 2010 - 12:38)
Effort méritoire en bout de ligne pour l'objet !
Est-ce bien utile ? Certainement pas si c'est pour faire ensuite un eval() ?
Seul le contexte pourrait nous renseigner à cet égard ... Comment donc arrivent ces différentes variables ?
Julien de Prabere a écrit :
Effort méritoire en bout de ligne pour l'objet !
Est-ce bien utile ? Certainement pas si c'est pour faire ensuite un eval() ?

Désolé, je n'ai rien compris. Pourquoi ne pas utiliser des termes moins ambigus et une ponctuation plus cohérente ?
Julien de Prabere a écrit :
Seul le contexte pourrait nous renseigner à cet égard ... Comment donc arrivent ces différentes variables ?

Je suis tout à fait d'accord. En revanche, les solutions de bric et de broc proposées plus haut sont inacceptables car illisibles et donc difficilement maintenables et peu robustes (sans parler de complexité algorithmique, ce qui serait peut-être hors-sujet, mais là encore cela dépend du contexte). Le Web se professionnalise, heureusement. Smiley cligne

P.S. : zardoz, Math.max accepte un nombre quelconque d'arguments.
Modifié par Julien Royer (15 Oct 2010 - 14:21)
merci pour ces réponses !

C'est nickel pour mes besoins, j'ai réussit à faire ce que je voulais.

C'est dommage que le langage JS soit aussi peux fourni en fonctionnalité de gestion de tableau...
C’eût été tout de même intéressant ! Les objets ont-ils effectivement quelque utilité pour déterminer le rang de la variable au plus grand argument ?
Cordialement.
Pages :