2011-03-15 201 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); 
});