11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à vous !

Une de mes variables contient un mot. Ce que je souhaite obtenir est : toutes les lettres de ce mot mais dans n'importe quel ordre.

Exemple :

var test = "alphonse2007";
// fonction melangeant toutes les lettres
alert(test); // retourne par exemple : ploa07n2se0h


Donc en gros, je voudrais obtenir le même résultat que la fonction str_shuffle() de PHP.

Merci d'avance pour vos idées et/ou vos pistes.
Modifié par Alphonse (28 Nov 2007 - 11:02)
Voici une proposition, non testée :


String.prototype.shuffle = function () {
var chars = this.split('');
var permutations = 1 + Math.random() * chars.length/ 2.5;
for (var k=0; k < permutations; k++) {
var i = Math.floor(Math.random() * chars.length), j;
while ((j= Math.floor(Math.random() * chars.length)) == i) ;
var tmp = chars[i];
chars[i] = chars[j];
chars[j] = tmp;
}
return chars.join('');
}
[/i][/i]
Salut,

Un truc tout bête :

function $random(min, max){
	return Math.floor(Math.random() * (max - min + 1) + min);
};

function shuffle(sentence) {
    return sentence
	.split("")
	.sort(function(a,b) {
	    if($random(0,100)%2 == 0) {
	        return 1;
	    } else {
	        return -1;
	    }
	}).join("");
}

var chars = "Hollywood"
shuffle(chars);

Modifié par Shinuza (28 Nov 2007 - 03:11)
Tant qu'on y est :

String.prototype.shuffle = function () {
    return this
	.split("") 
	.sort(function(a,b) { 
return (Math.random()<0.5? 1: -1);
   } 
	}).join(""); 
}  


Mais je ne suis pas sûr que ce soit du véritable pseudo-aléatoire ... à mon avis ça doit être un peu orienté et le résultat doit beaucoup dépendre de l'impémentation de sort.
La première proposition non testée ne fonctionne pas mais les deux autres fonctionnent exactement comme je le souhaitais : je dis les "deux autres" mais elles ont l'air tout à fait identiques !

Un grand merci à vous deux et je pense que je vais plus pencher pour l'écriture de QuentinC Smiley cligne
Remarque: le dernier code de QuentinC contient une erreur (une accolade en trop ou mal placée), il ne s'agit de pas grand chose mais je poste toutefois le code fonctionnel.

String.prototype.shuffle = function () {
	return this
	.split("") 
	.sort(function(a, b) { 
		return (Math.random() < 0.5 ? 1 : -1);
	}).join("");
};
QuentinC a écrit :
Tant qu'on y est :

String.prototype.shuffle = function () {
    return this
	.split("") 
	.sort(function(a,b) { 
return (Math.random()<0.5? 1: -1);
   } 
	}).join(""); 
}  


Mais je ne suis pas sûr que ce soit du véritable pseudo-aléatoire ... à mon avis ça doit être un peu orienté et le résultat doit beaucoup dépendre de l'impémentation de sort.

Personellement je n'aurais pas étendu le prototype, si la fonction sert à un seul endroit du code, autant l'utiliser en tant que tel au lieu d'alourdir le proto.

Sinon, sort doit confronter chacun des membres du tableau une fois à tous les autres membres.
C'est bien possible que ma première proposition ne fonctionne pas, je ne l'avais pas testée.
Pour ma deuxième, j'ai simplement raccoursi la fonction de chinusa... donc fonctionnellement c'est la même, la mienne est juste un peu plus courte.

a écrit :

Sinon, sort doit confronter chacun des membres du tableau une fois à tous les autres membres.

Pas forcément, justement... ça dépend de l'algo utilisé pour trier.
Je ne comprend pas trop d'où vient le "a" et le "b" de la fonction anonyme se trouvant dans la fonction sort()

J'ai supprimé ces deux variables et le code fonctionne (visiblement) tout aussi bien !
Salut,
Alphonse a écrit :
Je ne comprend pas trop d'où vient le "a" et le "b" de la fonction anonyme se trouvant dans la fonction sort()

Ce sont les deux éléments du tableau qui doivent être comparés par la fonction. Dans ce cas, tu peux en effet t'en passer étant donné qu'ils ne sont pas utilisés.