jquery多维数组shuffle随机

我想最小化我的代码:

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); 

至:

 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]]; fisherYates(multArr); 

我想要的输出是这样的:

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

我试过这段代码:
http://jsfiddle.net/arrow/yFn8U/

 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 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]]; fisherYates(multArr); 

但是我的代码只是随机化了块的顺序而不是每个块中的值。
我想要的输出是这样的:

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

我希望数组中的每个块都处于相同的顺序,但每个块必须随机化。
有没有办法用jQuery做到这一点?
我也想知道如何从洗牌/随机数组中获取值?
目前我得到这样的值:

 myArrayA[i] myArrayB[i] myArrayC[i] myArrayD[i] myArrayE[i] 

我猜我会得到类似的东西:

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

最后我想知道最小化代码会带来更好的性能吗?

如果您只想对数组中的所有元素运行操作,则应使用map或forEach 。 我确定jquery在旧版浏览器中为这些方法提供了填充程序。 因此,如果我们假设您正在使用原始的fisherYatesfunction,我们可能会有这样的事情:

 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) }); 

请参阅控制台

这个工作的例子

小提琴代码

 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; } } $(function() { $("button").on("click", function(e) { 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]]; $.each(multArr, function(i) { fisherYates(this) }); console.log(multArr) }) }) 

在这里查看我的代码。 基本上只是循环遍历多维数组的元素并在其上运行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; } } } 

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