如何随机化这种两种不同的javascript数组

时间:2012-09-05 17:53:13

标签: javascript jquery arrays

我有两个不同的数组,比如这个

var images = [{
    "src": "images2/animal_1.jpg",
    "title": "Dog"},

{
    "src": "images2/animal_2.jpg",
    "title": "Cat"},

{
    "src": "images2/animal_3.jpg",
    "title": "Sheep"},

{
    "src": "images2/animal_4.jpg",
    "title": "Cow"}];

var name = ["Dog", "Cat", "Sheep", "Cow"];​

我需要独立地对两个数组进行洗牌。但是一个条件图像数组的标题和名称数组值永远不会带有相同的索引。我怎么能这样做。

3 个答案:

答案 0 :(得分:1)

您需要创建两个函数。

getRandomValue()函数将数组作为输入,并为您提供随机索引和值。

function getRandomValue(myArray)
{
    var index = Math.floor(Math.random() * myArray.length);
    return [myArray[index], index];
}

现在声明您的imagesnames数组。

var images = [{
    "src": "images2/animal_1.jpg",
    "title": "Dog"},

{
    "src": "images2/animal_2.jpg",
    "title": "Cat"},

{
    "src": "images2/animal_3.jpg",
    "title": "Sheep"},

{
    "src": "images2/animal_4.jpg",
    "title": "Cow"}];

var name = ["Dog", "Cat", "Sheep", "Cow"];​

现在我们的主要功能来到这里。首先,通过将图像数组传递给randomValue()函数来获取随机图像。这些名称的方式相同。返回的每个值都是值和索引的数组。

现在比较索引,如果索引不同,则将两者都作为数组返回。否则,返回函数生成另一个函数。

function getImgName()
{
    var img = getRandomValue(images);
    var nam = getRandomValue(name);
    if (img[1] != nam[1])
        return getImgName();
    else
        return [img[0], nam[0]];
}

答案 1 :(得分:0)

首先,使用favorite algorithm随机播放一个数组,例如Fisher-Yates-Knuth shuffle

现在,再次对那个结果进行洗牌,但现在使用已知的移动每个元素的算法:

function shuffleMove(array) {
    var i = array.length;
    while (--i) {
        // Notice the difference to the normal algorithm:
        // j will be a number different from i
        var j = Math.floor(Math.random() * i);
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    return array;
}

在您的情况下,使用将是:

images.shuffle();
var names = [];
for (var i=0; i<images.length; i++)
    names[i] = images[i].title;
shuffleMove(names);

答案 2 :(得分:0)

改组数组,使用Knuth的shuffle。为了满足条件,每次迭代都需要检查并在必要时重新滚动

for (var i = name.length-1; i > 0; i--) {  
  while(1) {
    var index = Math.floor(Math.random() * i);
    // check condition 
    if (name[index] === images[i].title)
      continue;
    // swap
    var temp = name[i];  
    name[i] = name[index];  
    name[index] = temp;  
    break;  
  }  
}