随机播放多个相关数组
Shuffle multiple related arrays
我在javascript中有三个数组,例如:
one = [1,2,3,4];
two = [5,6,7,8];
three = [9,10,11,12];
然后,如果我打电话给shuffle(one,two,three)
那么它可能会产生
one = [2,3,1,4];
two = [6,7,5,8];
three = [10,11,9,12];
例如,看看 2、6 和 10 stlil 如何对齐,并且所有三个都具有相同的索引?这就是我所说的在其他列表中保持数字相互关联的意思。
如何编写上面定义的shuffle
函数?
zip = function() {
var args = [].slice.call(arguments, 0);
return args[0].map(function(_, i) {
return args.map(function(a) {
return a[i]
})
})
}
unzip = function(a) {
return a[0].map(function(_, i) {
return a.reduce(function(y, e) {
return y.concat(e[i])
}, [])
})
}
shuffle = function(a) {
for (var i = a.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var t = a[i];
a[i] = a[j];
a[j] = t;
}
return a;
}
z = unzip(shuffle(zip(one, two, three)))
one = z[0]
two = z[1]
three = z[2]
有点啰嗦,但有效...
另一种选择,在这种情况下可能更快:
range = function(n) {
for(var r = [], i = 0; i < n; i++)
r.push(i);
return r;
}
pluck = function(a, idx) {
return idx.map(function(i) {
return a[i];
});
}
r = shuffle(range(one.length))
one = pluck(one, r)
two = pluck(two, r)
three = pluck(three, r)
此外,最好有一个数组数组而不是三个变量:
matrix = [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
];
r = shuffle(range(matrix[0].length));
matrix = matrix.map(function(row) {
return pluck(row, r)
});
相关文章:
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 在javascript/angular中创建播放列表(按值复制数组,但按引用设置嵌套对象)
- 使用JSON检索PHP数组,并使用javascript中的数组来填充播放列表
- 如何从数组获取链接以在youtube Iframe API中播放
- 在 javascript 数组中播放音频文件时遇到问题
- 随机播放数组,因此没有两个键位于同一位置
- 数组中的第一个视频始终是第一个或第二个在下一个视频功能上播放
- 在“结束”上播放数组中的下一个视频
- 随机播放多个相关数组
- 获取 timeOut() 以每秒从数组中播放一首歌曲
- 尝试循环播放 HTML5 视频数组
- YouTube,在PlayerReady上,使用for循环获取数组中与单击箭头位置匹配的视频ID并播放
- 获取所有视频ID'使用YouTube API将从YouTube播放列表转换为PHP数组
- 循环播放歌曲数组html5音频
- 通过webRTC播放本地数组数据
- 如何播放和停止基于数组的动画
- 制作一个包含多个音乐播放列表选项的数组
- 当显示来自Javascript数组的多个按钮时,在按钮单击时播放声音