是否可以在数组内部和数组之间来回移动对象
Is it possible to shuffle objects around within and between an array of arrays?
假设我有一个类似的javascript数组
[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
我可以随机打乱子阵列的元素,得到这样的吗
[[16,4,10],[8,3,9],[1,14,18],[2,5,7],[6,17,11],[12,13,15]]
EDIT:所有子数组的长度都相同。新阵列将具有与旧阵列相同长度的子阵列。
我会使用下划线:http://underscorejs.org/
v = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
v2 = _.shuffle(_.flatten(v))
v3 = _.groupBy(v2, function(item, i) {
return i % v.length;
})
这会原地洗牌,不会返回新数组:
function shuffleMatrix (m) {
if (m.length == 0 || m[0].length == 0) {
// no rows or columns, just return it
return m;
}
function swap(i1, j1, i2, j2) {
if (i1 != i2 || j1 != j2) {
var temp = m[i1][j1];
m[i1][j1] = m[i2][j2];
m[i2][j2] = temp;
}
var rows = m.length;
var cols = m[0].length;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
var new_i = Math.random()*rows;
var new_j = Math.random()*cols;
swap(i, j, new_i, new_j);
}
}
}
function arrayShuffle(){
var tmp, rand;
for(var i =0; i < this.length; i++){
rand = Math.floor(Math.random() * this.length);
tmp = this[i];
this[i] = this[rand];
this[rand] =tmp;
}
}
Array.prototype.shuffle =arrayShuffle;
然后
for(var i in arrays){
arrays[i].shuffle()
}
顶层数组中数组的位置也是如此。
//编辑:读错:)
function shuffleAnyNumber (arrays) {
var numbers = new Array(); //collection of all numbers
for(var i in this){
for(var j in arrays[i]){
numbers.push( arrays[i][j]); //collect numbers out of the given arrays
}
}
numbers.shuffle(); //Method shown above
var output = new Array();
var tempArray= new Array();
//putting it together
for(var i in numbers){
if(tempArray.length == 3){
output.push(tempArray);
tempArray = new Array();
} else {
tempArray.push(numbers[i]);
}
}
return output;
}
我想它会这样工作的。
您可以将数组变平、打乱,然后再次拆分:
var flat = [].concat.apply([], myArray);
arrayShuffle(flat);
var newArray = [],
sublen = myArray[0].length;
for (var i=0; i<flat.length; i+= sublen)
newArray.push(flat.slice(i, i+sublen));
或者修改现有的shuffle算法之一以使用子数组中的项。例如,费雪-耶茨洗牌:
function shuffle2dArray(array) {
if (!array.length) return array;
var sublen = array[0].length,
len = array.length * sublen;
for (var i = len - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var ix = ~~(i/sublen),
iy = i % sublen,
jx = ~~(j/sublen),
jy = j % sublen;
var temp = array[ix][iy];
array[ix][iy] = array[jx][jy];
array[jx][jy] = temp;
}
return array;
}
我100%赞同Ilan Berci的回答。然而,您可以使用下划线以更实用的风格编写它:
var v = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]];
return _(v).chain().flatten().shuffle().groupBy(function(item, i) {
return i % v.length;
}).values().value();
转到下划线!!
相关文章:
- 将javascript数组中的项移动到特定位置的有效方法
- 使用window.location.htm和匹配的URL数组(一个用于桌面,一个用于移动)将桌面网站重定向到移动
- 如何移动到数组的上一个/下一个索引键
- Javascript(动态)插入到数组中,然后移动+1下面的所有元素
- azure移动服务中的数组长度问题
- Javascript:在对象数组中找到匹配项并移动到第一个位置
- Javascript 在数组对象中移动 .active 类
- 如何将javascript yml字符串移动到数据库to ruby数组
- 编写一个算法,该算法采用数组并将所有零移动到末尾
- 在 vue.js 中的数组之间移动项目
- 查找数组并将其移动到多重数组的开头
- 将最后一个元素移动到数组中的第二个项目的最快方法
- 如何将数组取消移动到对象的每个属性中
- 如何使用该数据数组从左向右移动画布
- 在 JavaScript 中将数组元素移动到变量
- 如何将值从 JSON 对象移动到 JS 数组
- 将排序数组的数组元素移动到具有特殊逻辑的另一个位置
- 在 json 数组中移动项
- JS数组移动元素
- 将php数组移动到jquery中进行操作