2013-08-29 17 views
9

Jeśli $('.my-element') pasuje do wielu elementów, czy istnieje szybki sposób na uzyskanie losowego elementu z tych elementów?

+0

Tak, w ten sam sposób, w jaki otrzymasz losową wartość z tablicy. –

Odpowiedz

26
$.fn.random = function() { 
    return this.eq(Math.floor(Math.random() * this.length)); 
}   

$(selector).random(); 
+2

Jeśli wtyczka jeszcze nie istnieje, utwórz ją. :) – htxryan

+2

Ten jest lepszy niż mój. – DeeDee

+1

Zauważyłem dziwne zachowanie. Jeśli selektor pasuje tylko do 2 elementów, twoja odpowiedź będzie miała tendencję (jak sądzę) zawsze zwracać pierwszą, ze względu na zaokrąglenie w dół na 'floor()'. Czy to tylko ja? –

1
var numElements = $('.my-element').length; 
var randomNum = Math.floor(Math.random()*numElements); 
//Select your random element 
$('.my-element:nth-child(' + randomNum + ')'); 
+2

To nie będzie działać poprawnie, ponieważ selektor [nth-child() jest oparty na 1) (http://api.jquery.com/nth-child-selector/), podczas gdy utworzona rutyna losowa jest oparta na 0. Ludzie często tęsknią za tym, ponieważ w programowaniu rzadko można zobaczyć coś na bazie 1. Twoja rutyna nigdy nie wybierze czwartej pozycji, jeśli są 4 przedmioty. – Volomike

2

Aby uzyskać równomierną dystrybucję, można pomnożyć przez losowy tablicy liczyć i upuść przecinku z operatorem bitowej.

var arr = ['a','b','c']; 
arr[~~(Math.random() * arr.length)]; //even odds of a, b, or c 
+0

~~ wydaje się dawać taki sam wynik jak Math.floor() – xtian

+0

Mają takie same wyniki, ale ~~ oblicza się szybciej, szczególnie w starszych przeglądarkach. Oto artykuł porównujący je: http://rocha.la/JavaScript-bitwise-operators-in-practice – myrcutio