我正在尝试动态构建一个多维数组。
我想动态构建它的原因是,如果数组增长到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);
)也不起作用,因为现在的代码。
阵列也应该是随机的(如顶部的第一个链接所述),但是一旦我让动态部分工作,我应该能够得到随机/随机的工作。
答案 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
innerArr
和fakeArr
的长度均为零,因为它们的值分别为[]
和""
,因此无需将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