2013-08-29 14 views
9

Se $('.my-element') corrisponde a più elementi, c'è un modo rapido per estrarre un elemento casuale da questi?

+0

Sì, allo stesso modo si otterrebbe un valore casuale da un array. –

risposta

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

$(selector).random(); 
+2

Se un plug-in non esiste già, creane uno. :) – htxryan

+2

Questo è migliore del mio. – DeeDee

+1

Ho notato un comportamento strano. Se il selettore corrisponde solo a 2 elementi, la tua risposta tenderà (credo) a restituire sempre il primo, a causa dell'arrotondamento verso il basso di 'floor()'. Sono solo io? –

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

Questo non funzionerà completamente perché il selettore [nth-child() è basato su 1] (http://api.jquery.com/nth-child-selector/), mentre la routine casuale che hai creato è basata su 0. La gente spesso manca questo perché è raro che in programmazione si veda qualcosa a base 1. La tua routine non selezionerà mai il 4 ° oggetto se c'erano 4 articoli. – Volomike

2

per ottenere una distribuzione uniforme, è possibile moltiplicare casuale dalla matrice contano e rilasciare i decimali con l'operatore bit per bit.

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

~~ sembra dare lo stesso risultato di Math.floor() – xtian

+0

Hanno lo stesso output, ma ~~ calcola più velocemente, specialmente nei browser più vecchi. Ecco un articolo che li confronta: http://rocha.la/JavaScript-bitwise-operators-in-practice – myrcutio

Problemi correlati