如何随机选择一个数组,然后在javaScript中随机选择一个元素?
我正在通过数组显示图像。我的问题是与功能changeOfferRandom
就是我希望做的,是删除当前图像从它的随机排列,因此不会再出现,然后从随机排列显示另一个图像。如何随机选择一个数组,然后在javaScript中随机选择一个元素?
我是新来这个,所以我不知道都怎么尝试此。我没有将所有这些图像放在一个数组中的原因是因为稍后我将添加一个函数,以仅基于标签显示图像。这些数组基于标签。无论如何,我相信我需要能够识别正在显示的图像。
var data = [];
function importJson(str) {
if (str=="") {
document.getElementById("content").innerHTML="";
return;
}
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status == 200){
data = JSON.parse(xmlhttp.response);
alert(xmlhttp.response);
var fullindex = data.clothes.length + data.food.length + data.sport.length;
for (var sport_index = 0; sport_index < data.sport.length; sport_index++) {
var id1 = data.sport[sport_index].ImagesId;
var url1 = data.sport[sport_index].ImagesPath;
var tag1 = data.sport[sport_index].Tag;
}
for (var food_index = 0; food_index < data.food.length; food_index++) {
var id2 = data.food[food_index].ImagesId;
var url2 = data.food[food_index].ImagesPath;
var tag2 = data.food[food_index].Tag;
}
for (var clothes_index = 0; clothes_index < data.clothes.length; clothes_index++) {
var id3 = data.clothes[clothes_index].ImagesId;
var url3 = data.clothes[clothes_index].ImagesPath;
var tag3 = data.clothes[clothes_index].Tag;
}
function firstRandom(){
var possibleImages = [url3, url2, url1];
var offer = possibleImages[(Math.random() * possibleImages.length)|0];
buildImage(offer);
}
firstRandom();
}
}
xmlhttp.open("GET","http://server/~name/folder/many.php");
xmlhttp.responseType = "json";
xmlhttp.send();
function buildImage(imagesrc) {
var img = document.createElement('img');
img.src = imagesrc;
document.getElementById('content').appendChild(img);
}
}
function changeOfferRandom() {
delete data[currentImage]; //not sure how to achieve this.
var allArrays = [url3, url2, url1]; //not sure how to access the full arrays.
var randomO = allArrays[(Math.random() * possibleImages.length)|0];
buildImage(randomO);
}
window.onload = importJson();
xmlhttp.response看起来是这样的:
{"sport":[
{"ImagesId":"34","ImagesPath":"http:\/\/server\/~name\/folder\/images\/24-08-2014-1408868419.png","Tag":"sport"},
{"ImagesId":"30","ImagesPath":"http:\/\/server\/~name\/folder\/images\/23-08-2014-1408824125.png","Tag":"sport"}],
"clothes":[
{"ImagesId":"33","ImagesPath":"http:\/\/server\/~name\/folder\/images\/23-08-2014-1408824179.png","Tag":"clothes"},
{"ImagesId":"32","ImagesPath":"http:\/\/server\/~name\/folder\/images\/23-08-2014-1408824166.png","Tag":"clothes"}],
"food":[
{"ImagesId":"31","ImagesPath":"http:\/\/server\/~name\/folder\/images\/23-08-2014-1408824158.png","Tag":"food"}]
}
首先,你的三个for
-loops是没有意义的,他们应该被删除。您将多次重新分配相同的三个变量。其次,我会将当前显示的图像(具有imagePath
的图像)的对象存储在全局变量中,以便稍后可以访问该图像。 要删除当前显示的图像中changeOfferRandom
那么你可以说
var tagArray = data[currentlyShownOffer.Tag];
tagArray.splice(tagArray.indexOf(currentlyShownOffer), 1);
其中,在constrast到delete
,不留一个空槽。
要获得一个新的随机优惠,请与
var tags = Object.keys(data);
var randomTag = tags[Math.floor(Math.random() * tags.length)];
window.currentlyShownOffer = randomTag[Math.floor(Math.random() * randomTag.length)];
这样一来,原来的tagified阵列将被保留,并且可以稍后访问。
我仍然使用我的buildImage函数来显示div内容中的图像吗?谢谢你,第二块代码会在一个函数中执行吗? – 2014-08-29 07:39:55
加上是我的循环辞职到相同?url1 url2 url3是不同的 – 2014-08-29 07:48:58
是的,第二块是一个函数,这是每当你交换图片时调用。请注意,我没有包含代码来实际交换'''img'''的源代码。您的for循环根本不需要,因为它们只触摸数据并将其分配给几个变量。你不需要这些变量。 – thriqon 2014-08-29 09:25:42
你能告诉我们一些关于你的实际问题是什么?你的代码不工作,如果是的话,错误是什么,预期的与实际的行为等? – thriqon 2014-08-29 06:55:53
代码在创建第一个随机图像方面起作用。我现在需要现在创建一个名为changeOfferRandom的代码底部的函数。我需要删除当前报价并显示新的随机报价。这是我的问题。图像加载到数组中并创建第一个随机图像正在工作。 – 2014-08-29 06:59:19
你可以发一个简单的例子来说明'http:// server /〜name/folder/many.php'可能会发回吗? – thriqon 2014-08-29 07:03:00