2011-03-15 50 views
4

好的,我正在jQuery/javascript中構建一個測驗應用程序。如何使用相同的隨機排序對兩個數組進行排序

以下小函數旨在隨機化問題的一系列可能答案以及一系列照片。每張照片對應一個答案。

在我調用此函數之前,照片和答案在各個包裝集合中的順序相同。

函數確實隨機化兩個集合。但每一個都是分開隨機分配的。我需要他們都有同樣的隨機化。

我不知道如何實現這一點。我想也許能夠鏈接他們的jQuery風格,但這是不對的。我也嘗試在sort()中分離出這個函數,但是這也不能解決問題。

誰能幫助?

function randomize() { 
    var elemsPhotos = $('.photos').children('img').get(); 
    var elemsQuests = $('.answers').children('.answerLine').get(); 
    elemsPhotos.sort(function() { return (Math.round(Math.random())-0.5); }); 
    elemsQuests.sort(function() { return (Math.round(Math.random())-0.5); }); 
    $('.photos').remove('img'); 
    $('.answers').remove('.answerLine'); 
    for (var i=0; i < elemsQuests.length; i++) { 
     $('.photos').append(elemsPhotos[i]);  
     $('.answers').append(elemsQuests[i]);  
    } 
} 

回答

4

你爲什麼不隨意用隨機化一個數組0值(其中n是問題/照片的數量),並使用該數組獲取每個問題/照片數組中的「隨機」索引?

var elemsPhotos = $('.photos').children('img').get(); 
var elemsQuests = $('.answers').children('.answerLine').get(); 
var n = elemsQuests.length; 
var randomIndexes = []; 
for (var i=0; i<n; i++) { 
    randomIndexes[i] = i; 
} 
randomIndexes.sort(function() { return (Math.round(Math.random())-0.5); }); 

$('.photos').remove('img'); 
$('.answers').remove('.answerLine'); 
for (var i=0; i < n; i++) { 
    $('.photos').append(elemsPhotos[randomIndexes[i]]);  
    $('.answers').append(elemsQuests[randomIndexes[i]]);  
} 
+0

這樣做的伎倆,除了你的排序()中有「返回」。非常感謝。 – Kirkman14 2011-03-15 02:45:19

+0

oops :)複製粘貼,你修好了,謝謝! – 2011-03-15 02:55:14

5

如果他們進來作爲,你可以使用一個DIV持有他們與隨機化的div而不是排序?

否則,你可以寫一個隨機數發生器來產生一個序列。即1,4,2,3作爲指標,然後按順序放置照片和答案?

元件1->現在的位置是1

元件2->現在的位置是4

元件3->現在的位置是2

元件4->現在的位置是3

+0

隨機化的指標;聰明的想法。請記住,在通過這些索引重新映射陣列時必須小心。例如。如果你天真地做了上面的例子,那麼你將重新映射元素* 2 *到位置* 3 *,因爲元素2被映射到位置4之前被重新映射。最簡單的方法是創建一個新陣列並從舊陣列複製。 – luqui 2011-03-15 02:24:51

+0

就使用div而言,這對我來說不會有效,因爲照片和答案是分開存放在不同的DIV中的。 – Kirkman14 2011-03-15 02:46:48

+0

但是,關於生成另一個索引的答案似乎是現成的。我認爲這是Yanick在下面實施的。謝謝你的幫助! – Kirkman14 2011-03-15 02:47:15

0

您可以隨機對(照片,任務):

var photos = $('.photos').children('img').get(); 
var quests = $('.answers').children('.answerLine').get(); 

var pairs = []; 
for (var i=0; i < quests.length; i++) 
    pairs[i] = { photo: photos[i], quest: quests[i] }; 

// randomize 'pairs' any way you like 

$.each(pairs, function(i, val) { 
    $('.photos').append(val.photo);  
    $('.answers').append(val.quest); 
});