构建动态多维数组

时间:2013-05-18 23:04:42

标签: jquery multidimensional-array

我正在尝试动态构建一个多维数组。

我想动态构建它的原因是,如果数组增长到5个数字块中的1 - 1000。 像这样编写它会非常耗时:

[1, 2, 3, 4, 5],,,,,[996, 997, 998, 999, 1000]

我今天一整天都在苦苦挣扎,所以我决定发布这个问题,因为我现在完全陷入困境。

这是我想要动态构建的数组(我之前的帖子已经解决了):
Multi-dimensional array shuffle random

一旦正确构建动态数组,我想用'outerArr.forEach(fisheryates);'调用fisherYates()函数。得到这样的结果:

[4,2,3,5,1],[7,10,6,9,8],[11,15,12,14,13],[18,17,16,20,19],[22,21,25,23,24]


该数组将用于fadeOut / fadeIn图片 1.淡出第一组五张随机图片1-5
2.淡出首先设置
3.淡出第二组五张随机图片6-10
4.淡出第二组
5.淡出第三组五张随机图片11-15
6.等等......

我将使用这样的数组值:

$currImg = $('.rotator-image:visible', $currLi);
$next = $('.img' + outerArr[a][b], $currLi);
$currImg.fadeOut(1000);
$next.fadeIn(1000);

我试图在这些链接的帮助下解决这个问题:
jQuery.map
Create multidimentional array with dynamic form
Pointy的代码在this post

一些注意事项:我不想使用"var outerArr = new Array();"。我读到了应该避免的事情(?)。我想用jQuery方式实现这一点,如果可能的话,使用.push和$ .makeArray(以及$ .map)。但是,任何方法都表示赞赏。

这是我的代码(在JSfiddle中增加Javascript窗口以查看我的评论):(以及here

function fisherYates(myArray) {
    var i = myArray.length, j, tempi, tempj;
    if (i === 0) return false;
    while (--i) {
        j = Math.floor(Math.random() * (i + 1));
        tempi = myArray[i];
        tempj = myArray[j];
        myArray[i] = tempj;
        myArray[j] = tempi;
    }
}

var outerArr = [];
var innerArr = [];
var fakeArr = 0;
var zz = 0;

for (var z = 1; z < 26; ++z) {
    ++zz;
    if (zz != 5) {
        fakeArr = fakeArr + z + ",";
    } else {
       fakeArr = fakeArr + z;
       var realArr = $.makeArray(fakeArr);
       innerArr.push(realArr);
       outerArr.push(innerArr);
       innerArr = [];
       innerArr.length = 0;
       fakeArr = "";
       fakeArr.length = 0;
       zz = 0;
    }
}
// Shuffle/Randomize the numbers in each chunk but not the order of the five chunks
outerArr.forEach(fisherYates);
alert(outerArr);

问题是当我想从数组中获取值时。我没有得到单个值(如outerArr [1] [3]应该显示9)。我只得到每个完整的块(如6,7,8,9,10)。我相信我必须使用$ .map但我不知道如何使用$ .map作为我的例子。随机/随机函数(即outerArr.forEach(fisherYates);)也不起作用,因为现在的代码。

阵列也应该是随机的(如顶部的第一个链接所述),但是一旦我让动态部分工作,我应该能够得到随机/随机的工作。

2 个答案:

答案 0 :(得分:1)

你真的在错误的轨道上,你应该用jQuery来做这件事。这种代码与jQuery擅长的完全不同。 jQuery是一个 DOM操作库,而不是用于此类编码的通用JavaScript库。

如果你想要一个对这些类型的数组操作有用的库,一个好的起点是underscore.js或类似但更新的Lo-Dash。这些库具有各种数组和对象操作函数。最好检查这两个库的文档,看看它们是否有用。 (阅读完文档之后,如果你不确定要选哪个文档,那么任何一个都不会出错,但我的建议是Lo-Dash。)

否则,您应该简单地编写简单的JavaScript代码,使用旧式循环等等。

  

一些注意事项:我不想使用var outerArr = new Array();。我读到了应该避免的事情(?)。

您使用的是var outerArr = [];。这很好,而且这些天确实是推荐的做法。但这只是一种美容上的差异。 new Array()[]的意思完全相同,并且工作方式相同。将一个更改为另一个不会导致任何问题或解决任何问题。

此外,代码中的缩进是一团糟。无法判断哪些语句嵌套在哪些内容中。所以我冒昧地清理了缩进。请检查并确保我做对了。

我看到代码中有一个fisherYates()函数,但从不调用此函数。不知道这是关于什么的,也许你可以澄清一下。

什么是假数组?你为什么需要假阵列和真正的阵列?

此代码有两个无效的语句:

   innerArr = [];
   innerArr.length = 0;  // does nothing
   fakeArr = "";
   fakeArr.length = 0;  // does nothing

innerArrfakeArr的长度均为零,因为它们的值分别为[]"",因此无需将length设置为再次为零。

还有一个最后的建议:也许不是试图立即写出JavaScript代码,而是应该用英语写出 - 详细说明 - 确切地说输入是什么,输出是什么以及你认为会得到什么步骤那里。你在那里发布了你所描述的描述,但是有很多细节缺失。如果你能用英文或伪代码写出所有这些细节,它可能有助于更容易编写实际的代码。

我知道这不能回答你的问题,但它应该让你深思熟虑! : - )

答案 1 :(得分:0)

在用户Michael Geary和nnnnnn的帮助下,他们之前回答了我的问题并在搜索之后得到了解决方案。我在this帖子中发现了一段帮助我的代码。

我正在寻找的代码看起来像这样。还发布了 JSFiddle有评论。请将JSFiddle javascript窗口扩展为长篇评论。

function fisherYates(myArray) {
    var i = myArray.length, j, tempi, tempj;
    if (i === 0) return false;
    while (--i) {
        j = Math.floor(Math.random() * (i + 1));
        tempi = myArray[i];
        tempj = myArray[j];
        myArray[i] = tempj;
        myArray[j] = tempi;
    }
}

var outerArr = [];
var innerArr = [];
var f = 0;

for (var z = 1; z < 27; ++z) {
    ++f;
    if (f <= 5) {
        innerArr.push(z);
    } else {
        outerArr.push(innerArr);
        innerArr = [];
        f = 0;
        --z;
    }
}

alert(outerArr);
outerArr.forEach(fisherYates);
alert(outerArr);
alert(outerArr[0][0]);
alert(outerArr[4][4]);

由于我没有声望15我无法为Michael Geary的回答+1