2009-11-19 172 views
24

。我只想要第一個5.選擇5個隨機元素

有沒有另一種方法來做同樣的事情?

+0

你可以用一個div周圍的前五個服務器端,然後使用 李#先五:隨機 ? – Kzqai 2009-11-19 15:39:58

+0

不,我可以使用! – AlexC 2009-11-19 15:49:09

+0

我不知道支持「:random」僞選擇器的jQuery,你如何添加這個功能以及它背後的代碼邏輯是什麼? – duckyflip 2009-11-19 16:10:16

回答

52

以下是如何從jQuery選擇中獲得5個隨機元素,無需插件!

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

在這一點上,你有已隨機選擇從所有LIS是jQuery的返回

那麼你可以做任何你與他們喜歡的5個DomElements,
例如改變它們的顏色:

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

或顯示它們的組合的文本內容:

$(randomElements).text() 
+0

+1,但我很好奇你爲什麼在文本中拼寫「random」的原因一致,並且在代碼片段中一直不正確:...) – 2009-11-19 17:00:41

+3

一般想法很好,但不應該洗牌這樣的陣列。排序是洗牌數組效率低下的一種方式,而不一致的比較可能會導致問題(甚至可能導致排序無限循環)。最好使用Fisher-Yates shuffle(http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)。 – 2009-11-19 18:07:11

+6

這不會讓你成爲一個隨機排序的數組。這裏有一篇關於它的文章(它是Objective-C,但不應該)http://cocoawithlove.com/2010/06/sorting-nsmutablearray-with-random.html – 2010-06-14 09:22:43

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

但它總是需要第5個( – AlexC 2009-11-19 16:12:11

8

得到一個隨機數索引,1-5,並取得與該指數上行的孩子。像這樣:

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

哦,這是完全錯誤的,我把這個問題看作是從前五個中選擇一個隨機元素,而不是五個隨機元素,我想我需要睡覺!:D – 2009-11-20 03:24:07

+5

在這裏尋找這種解決方案。回答錯誤的問題並不總是不好:) – Zlatev 2010-05-11 17:16:50

+0

@Zlatev說什麼。 :) – SoreThumb 2011-07-06 17:08:07

-1

爲什麼不做到這一點,似乎很有效:

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

可能是因爲jQuery沒有':random'選擇器[再]]? – 2012-10-01 19:53:15

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

使用我創建了一個小腳本用於此目的的。這是通過首先創建jQuery元素數組的隨機混合和切片副本,然後過濾掉兩個數組中不存在的所有元素來完成的。

你可以在http://www.afekenholm.se/jquery-rand閱讀。這裏的腳本:

/** 
* 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);