我正在创建一个网格布局。我可以正确布置瓷砖,直到我洗牌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);
答案 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);