Mempertimbangkan:
var myArray = ['January', 'February', 'March'];
Bagaimana saya bisa memilih nilai acak dari array ini menggunakan JavaScript?
javascript
Sarah
sumber
sumber
Math.floor(Math.random(...))
panggilan, yang dibulatkan ke bawah.var rand = myArray[Math.random() * myArray.length>>0]
sedikit lebih cepatvar rand = myArray[Math.random() * myArray.length | 0]
Jika Anda sudah mendapat garis bawah atau tanda lahir yang termasuk dalam proyek Anda, Anda dapat menggunakannya
_.sample
.Jika Anda perlu mendapatkan lebih dari satu item secara acak, Anda dapat meneruskannya sebagai argumen kedua dalam garis bawah:
atau gunakan
_.sampleSize
metode ini di lodash:sumber
Metode Prototipe
Jika Anda berencana untuk mendapatkan nilai acak banyak, Anda mungkin ingin mendefinisikan fungsi untuk itu.
Pertama, letakkan ini di kode Anda di suatu tempat:
Sekarang:
Kode dirilis ke domain publik di bawah ketentuan lisensi CC0 1.0 .
sumber
.sample()
array apa pun untuk mendapatkan item acak~~
jauh lebih cepat daripadaMath.Floor()
, jadi ketika datang ke optimasi kinerja sambil menghasilkan output menggunakan elemen UI,~~
memenangkan permainan. INFO LEBIH LANJUTTetapi jika Anda tahu bahwa array akan memiliki jutaan elemen daripada Anda mungkin ingin mempertimbangkan kembali antara Operator Bitwise dan
Math.Floor()
, sebagai operator bitwise berperilaku aneh dengan jumlah besar. Lihat contoh di bawah ini dijelaskan dengan output. INFO LEBIH LANJUTsumber
Math.floor
sekarang :)Katakanlah Anda ingin memilih item acak yang berbeda dari yang terakhir kali (tidak benar-benar acak, tetapi masih merupakan persyaratan umum) ...
Membangun berdasarkan jawaban oleh @ Markus, kita dapat menambahkan fungsi prototipe lain:
Dan implementasikan seperti ini:
sumber
Jika Anda memiliki nilai tetap (seperti daftar nama bulan) dan ingin solusi satu baris
Bagian kedua dari array adalah operasi akses seperti yang dijelaskan dalam Mengapa [5,6,8,7] [1,2] = 8 dalam JavaScript?
sumber
Versi terpendek:
sumber
| 0
harus dilakukan| 0
sendiri adalah operasi bitwise yang tidak melakukan apa-apa, tetapi dalam float javascript dikonversi ke ints sebelum operasi bitwise . Jadi itu seperti bagaimana+ ''
tidak benar-benar melakukan apa pun tetapi dapat digunakan untuk mengubah hal menjadi string.Math.floor
tetapi itu adalah hal yang benar untuk dilakukan di sini. Ini adalah operator sehingga lebih cepat daripadaMath.floor
jika hanya karena sewaktu-waktu menjalankan beberapa kode dapat dilakukanMath.floor = someOtherFunction
dan mereka tidak dapat melakukan hal yang sama untuk '|'. Di sisi lain seperti untukMath.floor
dan|
menjadi berbeda mencobaMath.floor(-1.5)
vs-1.5 | 0
. Ngomong-ngomong, kamu tidak membutuhkan tanda kurung.|
memiliki prioritas yang sangat rendah.Jika Anda ingin menulisnya pada satu baris, seperti solusi Pascual, solusi lain adalah menuliskannya menggunakan fungsi find ES6 (berdasarkan pada fakta, bahwa kemungkinan memilih secara acak salah satu
n
item adalah1/n
):Gunakan pendekatan itu untuk tujuan pengujian dan jika ada alasan bagus untuk tidak menyimpan array dalam variabel terpisah saja. Kalau tidak, jawaban lain (
floor(random()*length
dan menggunakan fungsi terpisah) adalah jalan Anda.sumber
Faker.js memiliki banyak fungsi utilitas untuk menghasilkan data uji acak. Ini adalah opsi yang baik dalam konteks test suite:
Seperti yang disebutkan oleh komentator, Anda biasanya tidak boleh menggunakan perpustakaan ini dalam kode produksi.
sumber
Faker
yang memilih elemen array acak.Mengedit prototipe Array bisa berbahaya. Ini dia fungsi sederhana untuk melakukan pekerjaan itu.
Pemakaian:
sumber
Fungsi rekursif, mandiri yang dapat mengembalikan sejumlah item (identik dengan lodash.sampleSize ):
sumber
Untuk mendapatkan penggunaan array item acak crypto-strong
sumber
Ini mirip dengan, tetapi lebih umum daripada, solusi @ Jacob Relkin:
Ini ES2015:
Kode berfungsi dengan memilih angka acak antara 0 dan panjang array, lalu mengembalikan item pada indeks itu.
sumber
var item = myArray[Math.floor(Math.random()*myArray.length)];
atau versi yang lebih pendek yang setara:
var item = myArray[(Math.random()*myArray.length)|0];
Kode sampel:
sumber
Fungsi sederhana:
ATAU
ATAU
sumber
Menurut pendapat saya, lebih baik daripada bermain-main dengan prototipe, atau mendeklarasikannya tepat waktu, saya lebih suka mengeksposnya ke jendela:
Sekarang di mana saja di aplikasi Anda Anda menyebutnya seperti:
Dengan cara ini Anda masih bisa menggunakan
for(x in array)
loop dengan benarsumber
for...in
array, atau bahkan secara umum. Anda berisiko berjalan di rantai prototipe. Ini juga dimaksudkan untuk semua properti objek, tidak semua indeks dalam array. Jika Anda ingin menggunakan iterator pada array, gunakanfor (var i = 0; i < foo.length; i++){}
. Lebih baik lagi, gunakan sesuatu seperti ituArray.prototype.forEach
.Saya telah menemukan cara mengatasi komplikasi jawaban teratas, hanya dengan menggabungkan rand variabel ke variabel lain yang memungkinkan angka tersebut ditampilkan di dalam pemanggilan myArray [] ;. Dengan menghapus array baru yang dibuat dan mempermainkan komplikasinya, saya telah menghasilkan solusi yang berfungsi:
sumber
concat
selalu berubah di sini ...random
itu sendiri tidak mengubahnya, dan tidak ada yang dipanggil lebih dari sekali ....Anda menetapkan variabel konstan ke array, Anda kemudian memiliki konstanta lain yang memilih secara acak antara tiga objek dalam array dan kemudian fungsinya mengembalikan hasil.
sumber
Cara umum untuk mendapatkan elemen acak:
sumber
randojs membuat ini sedikit lebih sederhana dan mudah dibaca:
sumber
Berikut adalah contoh cara melakukannya:
sumber
metode lain yang mudah:
sumber
Buat satu nilai acak dan berikan ke array
Silakan coba kode berikut ..
sumber