1247 votes

Obtenez un élément aléatoire d'un tableau JavaScript

var items = Array(523, 3452, 334, 31, ..., 5346);

Comment obtenir un élément aléatoire de items ?

396 votes

La réponse n'impliquera pas jQuery

52 votes

Je n'ai jamais vu autant de réponses absolument identiques à une question...

11 votes

Les grands esprits, @Blindy

2624voto

Kelly Points 8780
var item = items[Math.floor(Math.random()*items.length)];

1 votes

Si je copie/colle ceci dans ma source, j'obtiens un 'Uncaught SyntaxError : Unexpected token" dans mon navigateur. Y a-t-il des caractères cachés qui sont copiés à partir des réponses de l'OS ?

157 votes

Math.random() ne sera jamais égal à 1, et ne devrait pas l'être. Le plus grand indice doit toujours être inférieur d'une unité à la longueur, sinon vous obtiendrez un message d'erreur. undefined erreur.

30 votes

Une solution élégante. Je l'ai testée : var items = ["a","e","i","o","u"] var objResults = {} for(var i = 0; i < 1000000; i++){ var randomElement = items[Math.floor(Math.random()*items.length)] if (objResults[randomElement]){ objResults[randomElement]++ }else{ objResults[randomElement] = 1 } } console.log(objResults) Les résultats sont assez aléatoires après 1000000 itérations : Object {u: 200222, o: 199543, a: 199936, e: 200183, i: 200116}

120voto

chim Points 1799

Utilisez le trait de soulignement (ou loDash :)) :

var randomArray = [
   '#cc0000','#00cc00', '#0000cc'
];

// use _.sample
var randomElement = _.sample(randomArray);

// manually use _.random
var randomElement = randomArray[_.random(randomArray.length-1)];

Ou pour mélanger un tableau entier :

// use underscore's shuffle function
var firstRandomElement = _.shuffle(randomArray)[0];

37 votes

Utiliser underscore ou lodash pour une seule fonction serait excessif, mais si vous réalisez une fonctionnalité js complexe, cela peut vous faire gagner des heures, voire des jours.

1 votes

Si la valeur minimale de l'indice d'underscore random est 0, elle n'a besoin que de la valeur maximale. Docs ici

26 votes

Aujourd'hui, l'underscore est également un meilleur choix pour cela. _.sample([1, 2, 3, 4, 5, 6])

105voto

Alnitak Points 143355

Si vous voulez vraiment doit utiliser jQuery pour résoudre ce problème (NB : vous ne devriez pas) :

(function($) {
    $.rand = function(arg) {
        if ($.isArray(arg)) {
            return arg[$.rand(arg.length)];
        } else if (typeof arg === "number") {
            return Math.floor(Math.random() * arg);
        } else {
            return 4;  // chosen by fair dice roll
        }
    };
})(jQuery);

var items = [523, 3452, 334, 31, ..., 5346];
var item = jQuery.rand(items);

Ce plugin retournera un élément aléatoire si on lui donne un tableau, ou une valeur de [0 n) si on lui donne un nombre, ou n'importe quoi d'autre, une valeur aléatoire garantie !

Pour plus de fun, le retour du tableau est généré en appelant la fonction récursivement en fonction de la longueur du tableau :)

Démonstration de travail à http://jsfiddle.net/2eyQX/

2 votes

@neoascetic le point de cette ligne est que choisir un élément d'un tableau n'est pas un problème de jQuery, c'est un problème de JS générique.

113 votes

0 votes

@damd re : your proposed edit - it was clearly incorrect, since there's a clear split between définir le plugin dans l'IIFE, et l'utilisation du plugin. Cependant, pour des raisons de cohérence, j'ai remplacé le $ dans la ligne d'utilisation avec jQuery .

51voto

Rocket Hazmat Points 87407
var random = items[Math.floor(Math.random()*items.length)]

15voto

Blindy Points 26706
var rndval=items[Math.floor(Math.random()*items.length)];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X