我想最小化我的代码:
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]];
最后我想知道最小化代码会带来更好的性能吗?
答案 0 :(得分:7)
如果您只想对数组中的所有元素运行操作,则应使用map或forEach。我确定jquery在旧浏览器中为这些方法提供了填充程序。因此,如果我们假设您未使用原始fisherYates
函数,我们可能会遇到以下情况:
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测试用例放在一起。
答案 1 :(得分:2)
你需要的只是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)
})
})
答案 2 :(得分:2)
查看我的代码here。基本上只是循环遍历多维数组的元素,并像这样运行渔民:
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维数组做这个,你将不得不递归地进行,这很有趣,但我认为这比你要求的要多。如果没有,我可以稍后更新。