我在一个数组中有3个图像,我随机化索引以随机生成它们,但我想生成每个图像4次。这样做最有效的方法是什么?
编辑(完整代码):
var image_array = ["image1.png", "image2.png", "image3.png"];
function set_page()
{
var table = document.getElementById("grid");
if(table != null)
{
for(var i = 0; i < table.rows.length; i++)
{
for(var j = 0; j < table.rows[i].cells.length; j++)
{
table.rows[i].cells[j].onclick = function() {
click_cell(this);
}
//table.rows[i].cells[j].style.backgroundImage = "url('../images/back.png')";
add_cell_image(table.rows[i].cells[j]);
}
}
}
}
function click_cell(cell)
{
}
function add_cell_image(cell)
{
for(var i = 0; i <= image_array.length; i++)
{
for(var j = 0; j <= image_array.length; j++)
{
var index = create_values();
cell.innerHTML = "<img class='cell_image' align='middle' width='90' height='90' src ='../images/" + image_array[index] + "'/>";
}
}
}
function create_values()
{
return Math.floor(Math.random() * image_array.length);
}
答案 0 :(得分:0)
您可以使用包含所有索引的数组和shuffle它:
<div id="cell"/>
<script>
images = ["img1", "img2", "img3"];
/**
* Shuffles array in place.
* @param {Array} a items The array containing the items.
*/
function shuffle(a) {
var j, x, i;
for (i = a.length; i; i--) {
j = Math.floor(Math.random() * i);
x = a[i - 1];
a[i - 1] = a[j];
a[j] = x;
}
}
function range(number) {
return Array.apply(null, Array(number)).map(function (_, i) {return i;});
}
function create_image(image_source) {
var img = document.createElement('img');
img.src = image_source;
img.classList.add('cell_image');
img.align = 'middle';
img.height = '90';
img.width = '90';
return img;
}
function add_cell_image(cell) {
indices = range(images.length * 4);
shuffle(indices);
for (let i = 0; i < indices.length; i++) {
image_source = "../images/" + images[indices[i] % images.length];
image = create_image(image_source);
cell.appendChild(image);
}
}
cell = document.getElementById('cell')
add_cell_image(cell);
</script>
答案 1 :(得分:0)
这是一个解决方案。不是最优雅,但它应该让你开始。
这个想法是创建一个选项数组 - 通过连接你的初始图像集X次。在您的原始问题中,您说您希望重复每个图像4次。因此,我们将通过连接初始数组4次来创建一个选项数组。
然后我们将使用.slice
从此选项数组中选择一个随机元素,这将从options数组中删除该选项。我们将继续这个,直到options数组为空。
var image_array = [1, 2, 3];
var options = create_options(image_array, 4);
function set_page(table, options) {
if (table != null) {
for (var i = 0; i < table.rows.length; i++) {
for (var j = 0; j < table.rows[i].cells.length; j++) {
var randIndex = Math.floor(Math.random() * options.length);
var item = options.splice(randIndex, 1)[0];
var imgEl = create_image(item);
table.rows[i].cells[j].appendChild(imgEl);
}
}
}
}
function create_image(image_id) {
var imgEl = document.createElement('img');
imgEl.src = "https://via.placeholder.com/350x150?text=" + image_id;
imgEl.classList.add('cell_image');
imgEl.height = '90';
imgEl.width = '90';
return imgEl;
}
function create_options(image_array, N) {
var options = [];
for (var i = 0; i < N; i++) {
options = options.concat(image_array);
}
return options;
}
set_page(document.getElementById('grid'), options);
<table id="grid">
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>