Shuffle Array扭曲

时间:2014-06-17 08:58:40

标签: javascript arrays

我正在创建一个网格布局。我可以正确布置瓷砖,直到我洗牌xposArray。

 populateXPosArray:function(){
        var i = arr.length;

        for(j=0;j<i;j++){

            if((j % cols) === 0){
                ypos += 70;//height of the tile
                xpos = 0;
            }
            xposArray.push(xpos);
            xpos += 70;//width of the tile

        }

        //tryApp.shuffleArray(xposArray);

        console.log("xPosArray : " + xposArray);//returns 0,70,140,210, 280,0,70,140,210,280,0,70,140,210,280,0,70,140,210,280,0,70,140,210, 280
    },

    shuffleArray:function(array){
        //Fisher–Yates shuffle    
        var m = array.length, t, i;
        // While there remain elements to shuffle…
        while (m) {
            // Pick a remaining element…
            i = Math.floor(Math.random() * m--);

            // And swap it with the current element.
            t = array[m];
            array[m] = array[i];
            array[i] = t;
        }

        return array;
    },

这可以在5列5行网格中完美地铺设瓷砖。如果我使用shuffleArray函数,则返回如下所示的数组,这是预期的,但不是我想要实现的。 ()括号仅用于说明目的,正如您所看到的那样,每组5中的值都是重复的,我需要避免这些值。

 (280,140,140,140,210),(70,70,280,280,210),(0,140,210,0,140),(210,210,70,70,0),(70,0,0,280,280)

有没有办法只调整前5个元素,然后是第2个等等,以便在同一个5组中没有出现相同的值?所以输出的一个例子是:

 (0,280,140,70,210),(70,0,210,140,280),(280,210,140,70,0),(210,70,140,280,0),(140,210,280,0,70);

1 个答案:

答案 0 :(得分:0)

你可以在N个部分中拆分数组,然后为每个子数组映射shuffle函数。

function split(a, n) {
    var len = a.length,out = [], i = 0;
    while (i < len) {
        var size = Math.ceil((len - i) / n--);
        out.push(a.slice(i, i + size));
        i += size;
    }
    return out;
}

var xset = split(xposArray,5);
var yset = xset.map(shuffleArray);
var flatten_arr = [];
var result = flatten_arr.concat.apply(flaten_arr, yset);