Considérer:
var myArray = ['January', 'February', 'March'];
Comment puis-je sélectionner une valeur aléatoire dans ce tableau en utilisant JavaScript?
javascript
Sarah
la source
la source
Math.floor(Math.random(...))
appel, qui arrondit.var rand = myArray[Math.random() * myArray.length>>0]
avoir été un peu plus rapidevar rand = myArray[Math.random() * myArray.length | 0]
Si vous avez déjà inclus un trait de soulignement ou un lodash dans votre projet, vous pouvez l'utiliser
_.sample
.Si vous devez obtenir plus d'un élément au hasard, vous pouvez le passer comme deuxième argument en soulignement:
ou utilisez la
_.sampleSize
méthode en lodash:la source
Méthode prototype
Si vous prévoyez d'obtenir une valeur aléatoire beaucoup, vous voudrez peut-être définir une fonction pour elle.
Tout d'abord, mettez ceci dans votre code quelque part:
Maintenant:
Code publié dans le domaine public sous les termes de la licence CC0 1.0 .
la source
.sample()
sur n'importe quel tableau pour obtenir un élément aléatoire~~
est beaucoup plus rapide queMath.Floor()
, donc quand il s'agit d'optimiser les performances tout en produisant une sortie en utilisant des éléments d'interface utilisateur,~~
gagne la partie. PLUS D'INFORMATIONSMais si vous savez que le tableau va avoir des millions d'éléments que vous voudrez peut-être reconsidérer entre l'opérateur au niveau du bit et
Math.Floor()
, en tant qu'opérateur au niveau du bit, se comporter bizarrement avec de grands nombres. Voir l'exemple ci-dessous expliqué avec la sortie. PLUS D'INFORMATIONSla source
Math.floor
maintenant :)Disons que vous voulez choisir un élément aléatoire différent de la dernière fois (pas vraiment aléatoire, mais toujours une exigence courante) ...
En s'appuyant sur la réponse de @Markus, nous pouvons ajouter une autre fonction prototype:
Et implémentez comme ceci:
la source
Si vous avez des valeurs fixes (comme une liste de noms de mois) et que vous souhaitez une solution sur une seule ligne
La deuxième partie du tableau est une opération d'accès telle que décrite dans Pourquoi [5,6,8,7] [1,2] = 8 en JavaScript?
la source
La version la plus courte:
la source
| 0
-il?| 0
lui-même est une opération au niveau du bit qui ne fait rien, mais en javascript, les flottants sont convertis en ints avant toute opération au niveau du bit . C'est donc quelque chose comme comment+ ''
ne fait vraiment rien mais peut être utilisé pour convertir des choses en chaînes.Math.floor
mais c'est la bonne chose à faire ici. C'est un opérateur, donc c'est plus rapide queMath.floor
si seulement parce qu'à tout moment pendant l'exécution, du code peut faireMath.floor = someOtherFunction
et ils ne peuvent pas faire la même chose pour '|'. D'autre part , comme pourMath.floor
et|
être différent essayerMath.floor(-1.5)
vs-1.5 | 0
. Soit dit en passant, vous n'avez pas besoin des parenthèses.|
a une très faible priorité.Si vous voulez l'écrire sur une ligne, comme la solution de Pascual, une autre solution serait de l'écrire en utilisant la fonction de recherche d'ES6 (basée sur le fait que la probabilité de sélectionner au hasard un des
n
éléments est1/n
):Utilisez cette approche à des fins de test et s'il existe une bonne raison de ne pas enregistrer le tableau dans une variable distincte uniquement. Sinon, les autres réponses (
floor(random()*length
et en utilisant une fonction séparée) sont votre voie à suivre.la source
Faker.js possède de nombreuses fonctions utilitaires pour générer des données de test aléatoires. C'est une bonne option dans le cadre d'une suite de tests:
Comme les commentateurs l'ont mentionné, vous ne devez généralement pas utiliser cette bibliothèque dans le code de production.
la source
Faker
laquelle sélectionne un élément de tableau aléatoire.L'édition d'un prototype de tableau peut être nuisible. Ici, c'est une fonction simple pour faire le travail.
Usage:
la source
Fonction récursive et autonome qui peut renvoyer n'importe quel nombre d'éléments (identique à lodash.sampleSize ):
la source
Pour obtenir un tableau de forme d'élément aléatoire crypto-fort, utilisez
la source
Ceci est similaire, mais plus général, à la solution de @Jacob Relkin:
C'est ES2015:
Le code fonctionne en sélectionnant un nombre aléatoire entre 0 et la longueur du tableau, puis en renvoyant l'élément à cet index.
la source
var item = myArray[Math.floor(Math.random()*myArray.length)];
ou version plus courte équivalente:
var item = myArray[(Math.random()*myArray.length)|0];
Exemple de code:
la source
Fonction simple:
OU
OU
la source
À mon avis, mieux que de jouer avec des prototypes ou de le déclarer juste à temps, je préfère l'exposer à la fenêtre:
Maintenant, n'importe où sur votre application, vous l'appelez comme:
De cette façon, vous pouvez toujours utiliser la
for(x in array)
boucle correctementla source
for...in
sur des tableaux, ni même en général. Vous courez le risque de marcher sur la chaîne du prototype. Il est également destiné à toutes les propriétés d'un objet, pas à tous les index d'un tableau. Si vous souhaitez utiliser un itérateur sur un tableau, utilisezfor (var i = 0; i < foo.length; i++){}
. Encore mieux, utilisez quelque chose comme à laArray.prototype.forEach
place.J'ai trouvé un moyen de contourner les complications de la réponse supérieure, simplement en concaténant la variable rand à une autre variable qui permet d'afficher ce nombre à l'intérieur de l'appel de myArray [] ;. En supprimant le nouveau tableau créé et en jouant avec ses complications, j'ai trouvé une solution de travail:
la source
concat
change jamais ici ...random
lui-même ne le change pas, et rien d'autre n'est appelé plus d'une fois ....Vous définissez une variable constante sur le tableau, vous avez ensuite une autre constante qui choisit au hasard entre les trois objets du tableau, puis la fonction renvoie simplement les résultats.
la source
Une façon générique d'obtenir des éléments aléatoires:
la source
randojs rend cela un peu plus simple et lisible:
la source
Voici un exemple de la façon de procéder:
la source
une autre méthode simple:
la source
Créez une valeur aléatoire et passez au tableau
Veuillez essayer le code suivant.
la source