Immer einen zufälligen Wert aus einer JavaScript-array
Betrachten:
var myArray = ['January', 'February', 'March'];
Wie kann ich wählen Sie einen zufälligen Wert aus diesem array mit JavaScript?
InformationsquelleAutor Sarah | 2010-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Math.floor(Math.random(...))
nennen, die rundet ab.Ahh, ich habe etwas neues gelernt. Ich war der Diskussion der Fall, wo es gleich GENAU 1, aber anscheinend (laut W3Schools) Math.random ist zwischen 0 inklusive und 1 exklusive. Mein schlechtes.
Ich mag mich irren, aber ich erinnere mich daran
var rand = myArray[Math.random() * myArray.length>>0]
etwas schneller...aber komplett unlesbar
nur im Fall, wenn Sie bereits lodash, die Sie verwenden können _.Beispiel(array)
InformationsquelleAutor Jacob Relkin
Ich habe festgestellt, dass es noch einfacher hinzufügen, um eine Prototyp-Funktion der Array-Klasse:
Nun bekomme ich ein zufälliges array-element nur durch Eingabe von:
Beachten Sie, dass diese fügen eine Eigenschaft, um alle arrays, also, wenn Sie Durchlaufen ein mit
for..in
Sie verwenden sollten.hasOwnProperty()
:(Das möglicherweise oder möglicherweise kein Problem für Sie.)
Es ist als eine wirklich schlechte Praxis, um die add/remove-Methoden auf Objekte, die Sie nicht besitzen. Nehmen Sie zum Beispiel prototype.js.
Nein, es ist nicht, es sei denn, du machst eine Bibliothek. Das ist eine Meinung.
Wenn Sie dies tun, werden Sie haben eine zusätzliche Eigenschaft auf alle Ihre arrays, vermasselt Ihr
for (i in array)
Schleifen ...Sie können eine Eigenschaft, die nicht-zählbare. Ich glaube dennoch, dass es schlechte Praxis zu monkey-patch-Prototypen. Funktion-binden (::) ist eine alternative: github.com/zenparsing/es-function-bind. @MarkusAmaltheaMagnuson die Lösung (unter Ausschluss der Eigenschaft bei der Iteration) ist zu viel, um zu merken, meiner Meinung nach, und kann sich vorstellen, subtile bugs.
InformationsquelleAutor Markus Amalthea Magnuson
Wenn Sie bereits unterstreichen oder lodash in Ihrem Projekt enthalten, die Sie verwenden können
_.- Beispiel
.Wenn Sie brauchen, um mehr als ein Element nach dem Zufallsprinzip, die Sie übergeben können, die als zweites argument unterstreichen:
oder verwenden Sie den
_.sampleSize
Methode in lodash:InformationsquelleAutor Brendan Nee
Sagen, Sie wollen entscheiden ein zufälliges Element, das anders aus der letzten Zeit (nicht wirklich zufällig, aber immer noch eine häufige Anforderung)...
Aufbauend auf die Antwort von @Markus, wir können hinzufügen, ein weiterer Prototyp-Funktion:
Und zu implementieren, etwa so:
InformationsquelleAutor CrazyTim
Prototyp-Methode
Wenn Sie planen, auf immer einen zufälligen Wert, eine Menge, möchten Sie vielleicht, um eine Funktion definieren, für die es.
Ersten, setzen Sie diese in Ihren code irgendwo:
Nun:
Code in die public domain entlassen, die unter den Bedingungen der CC0 1.0-Lizenz.
es ermöglicht Ihnen das aufrufen von
.sample()
auf jedem array um ein zufälliges ElementInformationsquelleAutor Ben Aubin
Die kürzeste version:
| 0
tun?Es wird wiederum von Float zu Int, genauso wie Mathe.Boden.
0 selbst ist eine bitweise operation, die nichts tut, aber in javascript Schwimmer sind konvertiert zu int-Werte vor jeder bitweise operation. Dass es So etwas wie
+ ''
ist nicht wirklich etwas tun, aber kann verwendet werden, um zu konvertieren Dinge zu strings.Es ist nicht das gleiche wie
Math.floor
aber es ist das richtige, was hier zu tun. Es ist ein operator, so ist Sie schneller alsMath.floor
wenn auch nur, weil zu jeder Zeit während der Ausführung einige code kannMath.floor = someOtherFunction
und Sie können nicht tun das gleiche für '|'. Auf der anderen Seite als fürMath.floor
und|
anders zu versuchenMath.floor(-1.5)
vs-1.5 | 0
. Durch die Art und Weise, die Sie nicht brauchen, die Klammern.|
hat eine sehr niedrige Priorität.InformationsquelleAutor foxiris
~~
ist viel schneller alsMath.Floor()
, so wenn es um performance-Optimierung bei der Herstellung der Ausgabe mithilfe von UI-Elementen~~
gewinnt das Spiel. MEHR INFOAber wenn Sie wissen, dass das array gehen, um Millionen von Elementen, als Sie vielleicht möchten zu überdenken, zwischen Bitweisen Operator und
Math.Floor()
als bitweiser operator Verhalten sich sonderbar mit großen zahlen. Siehe Beispiel weiter unten erklärt mit der Ausgabe. MEHR INFOInformationsquelleAutor Ankur Soni
Wenn Sie Feste Werte haben (wie ein Monat, name, Liste) und will einen one-line-Lösung
Den zweiten Teil der Reihe, ist eine access-Vorgang, wie beschrieben, in Warum tut [5,6,8,7][1,2] = 8 in JavaScript?
OP nie gefragt, für eine bestimmte Umgebung. Auch dieser Kommentar ist sinnlos, wie es angewendet werden könnte, um fast alle Antworten in dieser Frage 😉
Aber die meisten Leute kommen, um diese Frage aus der Google-Suche und die können die Lösung auch in anderen Szenarien als das ursprüngliche OP.
Haha die Leute frei sind, zu entscheiden, welcher Ansatz zu verwenden, bin ich nicht der clean code guideliness faq!
InformationsquelleAutor I.G. Pascual
Bearbeiten von Array-Prototyp kann schädlich sein. Hier ist es eine einfache Funktion, die Arbeit zu tun.
Verwendung:
InformationsquelleAutor Seagull
Dies ist ähnlich, aber allgemeiner als die, @Jacob Relkin Lösung:
Dies ist ES2015:
Der code funktioniert, indem Sie eine Zufallszahl zwischen 0 und der Länge des Arrays, die dann wieder das Element an dieser Indexposition.
InformationsquelleAutor Max Heiber
Rekursive standalone-Funktion zurückgeben kann eine beliebige Anzahl der Elemente (identisch mit lodash.sampleSize):
InformationsquelleAutor dwilt
Einfache Funktion :
ODER
ODER
InformationsquelleAutor Dhakshith
Faker.js hat viele utility-Funktionen für die Erzeugung von zufälligen Testdaten. Es ist eine gute Möglichkeit, im Rahmen einer test-suite:
Als Kommentatoren erwähnt haben, Sie sollten in der Regel nicht diese Bibliothek verwenden, in der Produktion code.
Faker
wählt ein zufälliges array-element."Einfaches problem" wie dieses sind in der Regel gelöst durch die Bibliotheken, die eine einfache Lösung für ein problem, dass Hunderte von Personen hatten bereits zu Gesicht mit. Diese Bibliotheken sind in der Regel robust und gut ausgetestet und befasst sich mit verschiedenen Vorsichtsmaßnahmen, die wir nicht wollen, zu re-implementieren. Es wäre in der Regel die situation, wo ich empfehlen würde, um eine Bibliothek.
Haben, als Sie sollten einfach kopieren, eine Methode aus der Bibliothek und legen Sie es in eine Datei utils
Die Beratung, die Bibliotheken sollten bewertet werden, für die Kosten - /nutzen-WRT Seite Gewicht, wenn Sie ausgeliefert werden, um ein web-browser ist eine fundierte Beratung und die ich von ganzem Herzen Zustimmen, dass der Versand Faker.js ein browser wäre lächerlich. Allerdings ist die Frage, nicht zu erwähnen, welche JS-runtime verwendet wird. Für eine NodeJS-basierte runtime schwerer Abhängigkeiten sind sehr vernünftig, was der Fall ist, wo ich bin mit Faker.js - Gurke in JS test-Suiten.
InformationsquelleAutor Nathan
Habe ich einen Weg gefunden, um die top-Antwort, Komplikationen, der nur durch die Verkettung der Variablen rand, um eine weitere variable, die es ermöglicht, die Zahl angezeigt werden im inneren der Aufruf von " myArray[];. Durch das löschen des neu erstellten Arrays und spielte mit ihm um, Komplikationen, ich habe eine funktionierende Lösung:
concat
sich ständig verändert hier...random
selbst ist nicht zu ändern, und nichts anderes ist immer mehr als einmal aufgerufen....Diese Lösung ist nicht ganz sinnvoll. Warum erstellen Sie eine variable namens concat?
InformationsquelleAutor FaverosGema
Meiner Meinung nach, besser als das Gefummel mit Prototypen , oder erklärt es nur in der Zeit, die ich lieber aussetzen Fenster:
Nun überall auf Ihre app, die Sie nennen mag:
Diese Weise können Sie immer noch
for(x in array)
Schleife richtigIch war nicht hier wenn jemand downvoted es, und ich wollte nicht downvote, aber meine Vermutung ist, dass aussetzen Fenster ist im Prinzip deklarieren Sie eine Globale variable. Siehe: stackoverflow.com/questions/2613310/...
Sie sollten nicht immer verwenden
for...in
auf arrays, oder auch im Allgemeinen. Sie laufen Gefahr, zu Fuß die Prototyp-Kette. Es ist auch gedacht für alle Eigenschaften eines Objekts, die nicht alle Indizes in einem array. Wenn Sie möchten, verwenden Sie einen iterator, der auf ein array, so verwendenfor (var i = 0; i < foo.length; i++){}
. Noch besser, verwenden Sie so etwas wieArray.prototype.forEach
statt.Ich lieber nicht, weil es belastet die globalen Bereich. Man könnte sagen, dass dies vielleicht der einzige dort zu sein, aber es gibt Gewohnheiten zu verletzen, dass eine gute Praxis.
InformationsquelleAutor frankies
weitere einfache Methode :
InformationsquelleAutor Kamuran Sönecek
Hier ist ein Beispiel, wie es zu tun:
InformationsquelleAutor varun
Diese arbeiten wie ein Charme für mich, ohne jede Wiederholung.
InformationsquelleAutor Mohamad Hamouday
Erstellen Sie einen zufälligen Wert und pass auf array
Versuchen Sie bitte folgenden code.
InformationsquelleAutor Jignesh Darji