4

我想最小化我的代码:

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

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

4

3 回答 3

7

如果您只是想对数组中的所有元素运行操作,那么您应该使用mapforEach。我确信 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 测试用例放在一起。

于 2013-05-17T20:26:13.143 回答
3

您所需要的只是 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)
    })
})
于 2013-05-17T20:33:32.007 回答
3

在这里查看我的代码。基本上只是遍历多维数组的元素并像这样在它们上运行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 维数组执行此操作,您将不得不递归地执行此操作,这会很有趣,但我认为这超出了您的要求。如果没有,我可以稍后更新。

于 2013-05-17T20:53:27.507 回答