2009-11-19 31 views
24

¿Cómo se seleccionan los primeros 5 elementos aleatoriosSeleccione 5 elementos aleatorios

<ul> 
    <li>First</li> 
    <li>Second</li> 
    <li>Third</li> 
    ... 
    <li>N</li> 
</ul> 

I'm using this plugin:

alert($("li:random").text()); 

pero se necesita todos los elementos aleatorios. Solo quiero los primeros 5.

¿Hay alguna otra manera de hacer lo mismo?

+0

¿Se puede envolver un div alrededor de la primera del lado del servidor cinco, a continuación, utilizar li # primero y cinco: al azar ? – Kzqai

+0

No, puedo usar! – AlexC

+0

No tengo conocimiento de que jQuery soporte el pseudo-selector ": random", ¿cómo se agrega esta funcionalidad y cuál es la lógica de código detrás de ella? – duckyflip

Respuesta

52

Aquí es cómo conseguir 5 elementos aleatorios a partir de una selección de jQuery, sin necesidad de plugins!

randomElements = jQuery("li").get().sort(function(){ 
    return Math.round(Math.random())-0.5 
}).slice(0,5) 

En este punto, usted tiene 5 DomElements que han sido seleccionados al azar de todas las lis de que jQuery volvió

A continuación, puede hacer lo que quiera con ellos,
por ejemplo, cambiar su color:

$(randomElements).css("color","red") 

o mostrar sus contenidos de texto combinados:

$(randomElements).text() 
+0

+1, aunque tengo curiosidad por saber por qué deletreó "aleatorio" de forma consistente correctamente en el texto, y consistentemente incorrectamente en los fragmentos de código ... :-) –

+3

La idea general es buena, pero no debe mezclar una una matriz como esa. La ordenación es una forma ineficaz de reorganizar una matriz, y una comparación incoherente puede causar problemas (incluso puede hacer que la ordenación se repita indefinidamente). Es mejor utilizar una combinación aleatoria de Fisher-Yates (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle). –

+6

Eso no te dará una matriz ordenada aleatoriamente. Aquí hay un artículo sobre esto (es Objective-C, pero no debería importar) http://cocoawithlove.com/2010/06/sorting-nsmutablearray-with-random.html –

0
$("li:lt(5):random").text() 
+2

Pero siempre se necesitan los primeros 5 ( – AlexC

8

Obtenga un índice de número aleatorio, 1-5, y obtenga el hijo del ul con ese índice. De este modo:

var index = Math.floor(Math.random() * 5) + 1; // nth-child indices start at 1 
alert($("ul:nth-child(" + index + ")").text()); 
+2

Oh , esto es completamente incorrecto. Leí la pregunta como que pedía un elemento aleatorio de los cinco primeros, no cinco elementos aleatorios del conjunto. ¡Creo que necesito dormir!: D –

+5

Encontré aquí buscando exactamente este tipo de solución. responder mal leer qestions no siempre es malo :) – Zlatev

+0

Lo que dijo @Zlatev. :) – SoreThumb

-1

¿Por qué no hacer esto, parece bastante eficiente:

jQuery('li:random').slice(0, 5); 
+4

Probablemente porque jQuery no tiene selector ': random' [más]? –

2
jQuery.jQueryRandom = 0; 
    jQuery.extend(jQuery.expr[":"], { 
    random: function(a, i, m, r) { 
     if (i == 0) { 
     jQuery.jQueryRandom = Math.floor(Math.random() * r.length); 
     }; 
     return i == jQuery.jQueryRandom; 
    } 
    }); 
8

Utilizando el He creado un pequeño script para este propósito. Esto se hace creando primero una copia aleatoriamente mezclada y cortada de la matriz de elementos jQuery, y luego filtrando todos los elementos que no existen en ambas matrices.

Puede leer sobre esto en http://www.afekenholm.se/jquery-rand. Aquí está la secuencia de comandos:

/** 
* jQuery.rand v1.0 
* 
* Randomly filters any number of elements from a jQuery set. 
* 
* MIT License: @link http://www.afekenholm.se/license.txt 
* 
* @author: Alexander Wallin (http://www.afekenholm.se) 
* @version: 1.0 
* @url: http://www.afekenholm.se/jquery-rand 
*/ 
(function($){ 
    $.fn.rand = function(k){ 
     var b = this, 
      n = b.size(), 
      k = k ? parseInt(k) : 1; 

     // Special cases 
     if (k > n) return b.pushStack(b); 
     else if (k == 1) return b.filter(":eq(" + Math.floor(Math.random()*n) + ")"); 

     // Create a randomized copy of the set of elements, 
     // using Fisher-Yates sorting 
     r = b.get(); 
     for (var i = 0; i < n - 1; i++) { 
      var swap = Math.floor(Math.random() * (n - i)) + i; 
      r[swap] = r.splice(i, 1, r[swap])[0]; 
     } 
     r = r.slice(0, k); 

     // Finally, filter jQuery stack 
     return b.filter(function(i){ 
      return $.inArray(b.get(i), r) > -1; 
     }); 
    }; 
})(jQuery); 
Cuestiones relacionadas