1

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

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

[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]


该数组将用于淡出/淡入图片。
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's code in this post

一些注意事项:我不喜欢使用"var outerArr = new Array();". 我在某处读到应该避免它(?)。如果可能的话,我想使用 .push 和 $.makeArray(和 $.map)以 jQuery 方式完成此操作。但是,任何方法都值得赞赏。

这是我的代码(在 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 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。shuffle/random 函数(即outerArr.forEach(fisherYates);)也不能像现在的代码那样工作。

该数组也应该是随机的(如顶部第一个链接中所述),但是一旦我让动态部分工作,我应该能够让随机播放/随机工作。

4

2 回答 2

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 代码,而应该用英文写出 - 详细的 - 确切的输入是什么,输出是什么,以及你认为哪些步骤可以让你到达那里。您发布的描述已经完成了一半,但是缺少很多细节。如果您可以用英语或伪代码写出所有这些细节,则可能有助于更轻松地编写实际代码。

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

于 2013-05-19T04:43:34.287 回答
0

在用户 Michael Geary 和 nnnnnn 的帮助下,他们之前回答了我的问题,经过四处搜索,我得到了解决方案。我在这篇文章中找到了一段对我有帮助的代码。

我正在寻找的代码看起来像这样。还发布在 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 我不能 +1 Michael Geary 的回答

于 2013-05-24T15:35:27.823 回答