Javascript jquery多维数组随机洗牌

Javascript jquery多维数组随机洗牌,javascript,jquery,Javascript,Jquery,我想从以下方面最小化我的代码: myArrayA = [1, 2, 3, 4, 5]; fisherYates(myArrayA); myArrayB = [6, 7, 8, 9, 10]; fisherYates(myArrayB); myArrayC = [11, 12, 13, 14, 15]; fisherYates(myArrayC); myArrayD = [16, 17, 18, 19, 20]; fisherYates(myArrayD); myArrayE = [21, 22,

我想从以下方面最小化我的代码:

myArrayA = [1, 2, 3, 4, 5];
fisherYates(myArrayA);
myArrayB = [6, 7, 8, 9, 10];
fisherYates(myArrayB);
myArrayC = [11, 12, 13, 14, 15];
fisherYates(myArrayC);
myArrayD = [16, 17, 18, 19, 20];
fisherYates(myArrayD);
myArrayE = [21, 22, 23, 24, 25];
fisherYates(myArrayE);
致:

我想要的输出如下:

[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]
[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]
myArrayA[i]
myArrayB[i]
myArrayC[i]
myArrayD[i]
myArrayE[i]
var multArr = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]];
multArr.forEach(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]
[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]
myArrayA[i]
myArrayB[i]
myArrayC[i]
myArrayD[i]
myArrayE[i]
var multArr = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]];
multArr.forEach(fisherYates);
我希望数组中的每个块的顺序相同,但每个块必须随机化。
有没有办法用jQuery做到这一点?
我还想知道如何从无序/随机数组中获取值?
此时,我得到如下值:

[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]
[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]
myArrayA[i]
myArrayB[i]
myArrayC[i]
myArrayD[i]
myArrayE[i]
var multArr = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]];
multArr.forEach(fisherYates);
我想我会用这样的东西来获得它们:

multArr [[0][i]];
multArr [[1][i]];
multArr [[2][i]];
multArr [[3][i]];
multArr [[4][i]];

最后,我想知道最小化代码是否会提供更好的性能?

如果您只是想对数组中的所有元素运行一个操作,那么应该使用或。我确信jquery为旧浏览器中的这些方法提供了垫片。因此,如果我们假设您使用的是原始的
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]
[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]
myArrayA[i]
myArrayB[i]
myArrayC[i]
myArrayD[i]
myArrayE[i]
var multArr = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]];
multArr.forEach(fisherYates);
在访问元素时,您几乎是对的,但您有一组括号太多:

multArr[1]; // == [6, 7, 8, 9, 10]
multArr[1][3]; // == 9

如果您真的担心应该组合一个jsperf测试用例,我不会对性能进行推测。

您所需要的只是jQuery的.each()方法,如下所示:

$.each(multArr, function(i) { fisherYates(this) });
请参阅上的控制台

小提琴代码 查看我的代码。基本上只是在多维数组的元素上循环,并在其上运行fisherYates,如下所示:

function fisherYates(myArray) {
    for(var i = 0; i< myArray.length; i++) {
       k = myArray[i].length;
       while(k--){
            j = Math.floor(Math.random() * (myArray.length - 1));
            tempk = myArray[i][k];
            tempj = myArray[i][j];
            myArray[i][k] = tempj;
            myArray[i][j] = tempk;
       }
    }
}
函数fisherYates(myArray){
对于(var i=0;i

现在,如果你想对一个n维数组这样做,你必须递归地这样做,这会很有趣,但我认为这比你要求的要多。如果没有,我可以稍后更新。

非常感谢David!正是我需要的:)我没有15个名声,所以我不能+1这个。@user2395212 lol,或者传统的forEach,同样的dif。欢迎来到SO!David,我还想提到的是,我现在看到forEach的其他代码中有更多的用法。再次感谢。所以我现在得到了18个声誉:)所以我现在+1你的答案DavidHoops,在发布之前没有得到看到其他答案的警告。foreach方法绝对是最干净的方法。谢谢Scott101。这是我想要的。我也对n维数组感兴趣。你有一个例子吗?我真的不知道什么是n维数组,但看到一些代码可能会让我明白。谢谢好的,那么我将使用forEach方法。谢谢你的信息。有点晚了,但是如果你有一个数组数组数组数组。。。n次,那么就有了一个n维数组。基本上在上面的例子中,你有一个三维数组(一维数组是一个值,二维数组是一个标准值数组)。如果你想让它成为一个四维数组,那么内部数组中的每个元素,例如(1,2,3,…,25)本身就是一个数组。但再一次,可能比你的问题所需要的要多。谢谢你,斯科特101。我想我现在开始理解n维数组了。谢谢。它工作得很好。我看了看代码,我想知道‘函数(I)’中的I从哪里得到它的值?或者它不需要一个值,因为fisherYates函数包含(i==0)?我猜您正在将I传递给fisherYates函数,还是我错了?对于“函数(I)”问题,我感到抱歉。我想我现在明白代码了。“函数(i)”中的“i”可以是任何其他字母或单词?还是我又错了?@user2395212是的。“i”只是指“索引”。你可以让它成为任何字母或单词,但它仍然意味着索引,在这种情况下,它不需要,只是一种哈比的力量谢谢你的解释。