Rozważać:
var myArray = ['January', 'February', 'March'];
Jak mogę wybrać losową wartość z tej tablicy za pomocą JavaScript?
javascript
Sarah
źródło
źródło
Math.floor(Math.random(...))
połączenie, które zaokrągla w dół.var rand = myArray[Math.random() * myArray.length>>0]
nieco szybszyvar rand = myArray[Math.random() * myArray.length | 0]
Jeśli masz już podkreślenie lub lodash w swoim projekcie, możesz użyć
_.sample
.Jeśli potrzebujesz losowo uzyskać więcej niż jeden przedmiot, możesz przekazać to jako drugi argument w podkreśleniu:
lub użyj
_.sampleSize
metody w lodash:źródło
Metoda prototypowa
Jeśli planujesz często uzyskiwać losową wartość, możesz chcieć zdefiniować dla niej funkcję.
Najpierw umieść to gdzieś w kodzie:
Teraz:
Kod wydany do domeny publicznej zgodnie z warunkami licencji CC0 1.0 .
źródło
.sample()
dowolnej tablicy w celu otrzymania losowego przedmiotu~~
jest znacznie szybszy niżMath.Floor()
, więc jeśli chodzi o optymalizację wydajności podczas tworzenia danych wyjściowych przy użyciu elementów interfejsu użytkownika,~~
wygrywa. WIĘCEJ INFORMACJIAle jeśli wiesz, że tablica będzie zawierać miliony elementów, możesz ponownie rozważyć między operatorem
Math.Floor()
bitowym i , ponieważ operator bitowy zachowuje się dziwnie z dużymi liczbami. Zobacz poniższy przykład objaśniony z danymi wyjściowymi. WIĘCEJ INFORMACJIźródło
Math.floor
teraz :)Powiedzmy, że chcesz wybrać losowy przedmiot, który różni się od ostatniego razu (niezbyt losowy, ale wciąż powszechny wymóg) ...
Opierając się na odpowiedzi @Markus, możemy dodać kolejną funkcję prototypową:
I zaimplementuj tak:
źródło
Jeśli masz ustalone wartości (np. Listę nazw miesięcy) i potrzebujesz rozwiązania jednowierszowego
Druga część tablicy to operacja dostępu opisana w Dlaczego w [5,6,8,7] [1,2] = 8 w JavaScript?
źródło
Najkrótsza wersja:
źródło
| 0
zrobić?| 0
sam w sobie jest bitową operacją, która nic nie robi, ale w javascript floaty są konwertowane na ints przed każdą operacją bitową . To coś w rodzaju tego,+ ''
że tak naprawdę nic nie robi, ale może być użyte do konwersji rzeczy na ciągi.Math.floor
ale jest to właściwe. Jest to operator, więc jest szybszy niżMath.floor
choćby dlatego, że w dowolnym momencie podczas działania może zrobić jakiś kodMath.floor = someOtherFunction
i nie może zrobić tego samego dla „|”. Z drugiej strony, jak dlaMath.floor
i|
inności tryMath.floor(-1.5)
vs-1.5 | 0
. Nawiasem mówiąc, nie potrzebujesz nawiasów.|
ma bardzo niski priorytet.Jeśli chcesz napisać go w jednym wierszu, tak jak rozwiązanie Pascuala, innym rozwiązaniem byłoby napisanie go za pomocą funkcji wyszukiwania ES6 (w oparciu o fakt, że prawdopodobieństwo losowego wybrania jednego z
n
elementów wynosi1/n
):Zastosuj to podejście do celów testowych i jeśli istnieje uzasadniony powód, aby nie zapisywać tablicy tylko w osobnej zmiennej. W przeciwnym razie pozostałe odpowiedzi (
floor(random()*length
i korzystanie z oddzielnej funkcji) są na dobrej drodze.źródło
Faker.js ma wiele funkcji narzędziowych do generowania losowych danych testowych. Jest to dobra opcja w kontekście zestawu testów:
Jak wspomnieli komentatorzy, ogólnie nie powinieneś używać tej biblioteki w kodzie produkcyjnym.
źródło
Faker
której wybiera się losowy element tablicy.Edycja prototypu tablicy może być szkodliwa. Tutaj jest to prosta funkcja do wykonania pracy.
Stosowanie:
źródło
Rekurencyjna, samodzielna funkcja, która może zwrócić dowolną liczbę elementów (identyczne jak lodash.sampleSize ):
źródło
Aby uzyskać silną kryptowalutę losową formę formularza, użyj tablicy
źródło
Jest to podobne, ale bardziej ogólne niż rozwiązanie @Jacob Relkin:
To jest ES2015:
Kod działa, wybierając losową liczbę z zakresu od 0 do długości tablicy, a następnie zwracając element pod tym indeksem.
źródło
var item = myArray[Math.floor(Math.random()*myArray.length)];
lub równoważna krótsza wersja:
var item = myArray[(Math.random()*myArray.length)|0];
Przykładowy kod:
źródło
Prosta funkcja:
LUB
LUB
źródło
Moim zdaniem, lepiej niż zadzierać z prototypami lub zadeklarować go w samą porę, wolę wystawiać go na okno:
Teraz w dowolnym miejscu aplikacji możesz ją nazwać:
W ten sposób nadal możesz
for(x in array)
prawidłowo używać pętliźródło
for...in
tablic, a nawet ogólnie. Ryzykujesz chodzeniem po łańcuchu prototypów. Dotyczy to również wszystkich właściwości obiektu, a nie wszystkich indeksów w tablicy. Jeśli chcesz użyć iteratora na tablicy, użyjfor (var i = 0; i < foo.length; i++){}
. Nawet lepiej, użyj czegoś takiegoArray.prototype.forEach
.Znalazłem sposób na ominięcie komplikacji odpowiedzi, po prostu łącząc zmienną rand z inną zmienną, która umożliwia wyświetlanie tej liczby w wywołaniu myArray [] ;. Usuwając utworzoną nową tablicę i bawiąc się jej komplikacjami, wymyśliłem działające rozwiązanie:
źródło
concat
kiedykolwiek się tutaj zmienia ...random
sam nie zmienia tego i nic więcej nie jest wywoływane więcej niż raz ...Ustawiasz stałą zmienną na tablicę, a następnie masz inną stałą, która wybiera losowo między trzema obiektami w tablicy, a następnie funkcja po prostu zwraca wyniki.
źródło
Ogólny sposób uzyskiwania losowych elementów:
źródło
randojs sprawia, że jest to trochę prostsze i czytelniejsze:
źródło
Oto przykład, jak to zrobić:
źródło
inna łatwa metoda:
źródło
Utwórz jedną losową wartość i przekaż do tablicy
Spróbuj wykonać następujący kod ..
źródło