我是Javascript的新手并且正在使用基础知识。我想要创建一个数组,其中单个元素是随机绘制的,一次一个,只需单击一个按钮,直到所有数组元素都显示在屏幕上。我的代码几乎就在那里。但问题是,当它运行时,它总是在第一个按钮点击时抓取2个元素,而不是1.它对其余元素运行良好。当然会对这个问题有所了解。谢谢。
var myArray=['1','2','3','4','5','6','7']
var text = "";
var i;
function RandomDraw() {
for(i = 0; i < myArray.length; i+=text) {
var ri = Math.floor(Math.random() * myArray.length);
var rs = myArray.splice(ri, 1);
document.getElementById("showSplice").innerHTML = text+=rs;
//document.getElementById("showArrayList").innerHTML = myArray;
}
}
答案 0 :(得分:1)
“always”因i+=text
而绘制2个元素。你的数组很小,因此循环需要2次迭代(使用字符串来获得数字i
)以超过myArray.length
。
First iteration:
i = 0 => 0 < myArray.length => true
prints number
Second iteration: (say '4' get choosen)
i = i + text and text = '4' => i = "04" => "04" < myArray.length => true
prints number
Third iteration: (say '3' get choosen)
i = i + text and text = '43' => i = "0443" => "0443" < myArray.length => false
loop breaks
因此有可能打印出两个元素。根据数组的长度,可能会有更多。
您不需要循环,只需选择一个数字并打印出来:
function RandomDraw() {
if(myArray.length > 0) { // if there still elements in the array
var ri = Math.floor(Math.random() * myArray.length); // do your job ...
var rs = myArray.splice(ri, 1);
document.getElementById("showSplice").textContent = rs; // .textContent is better
}
else {
// print a message indicating that the array is now empty
}
}
答案 1 :(得分:1)
另一个解决方案是对数组进行洗牌,然后在每次单击时,pop
来自洗牌数组的元素。
function shuffle(array) {
return array.sort(function() { return Math.random() - 0.5; });
}
var button = document.getElementById('button');
var origin = ['1','2','3','4','5','6','7'];
var myArray = shuffle(origin);
var currentValue = null;
button.onclick = function() {
currentValue = myArray.pop();
if(!!currentValue) {
console.log(currentValue);
}
}
<button id='button'>
get element
</button>
你可以在每次点击时再次洗牌,但我认为没有必要......
如果您对Math.random() - 0.5
感到奇怪:
[...]
Math.random
返回0到1之间的数字。因此,如果您拨打Math.random() - 0.5
,则有50%的机会获得负数,50%的机会获得'{1}}我会得到一个正数。 如果运行for循环并将这些结果添加到数组中,您将有效地获得负数和正数的完整分布。
答案 2 :(得分:0)
我会这样做:
RandomDraw
每次拨打<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
时,它都会返回一个随机数,而不会重复。
答案 3 :(得分:0)
我理解它的方式,你想在单击后从数组中绘制每个项目。所以需要循环。
正如其他人所说,你的for循环中有几个问题:
你可以纠正你的for循环:
function RandomDraw() {
var length = myArray.length;
var ri = 0;
for (var i=0;i<length;i++) {
ri = Math.floor(Math.random() * myArray.length);
console.log("Random index to be drawn : " + ri);
// removing that index from the array :
myArray.splice(ri, 1);
console.log("myArray after a random draw : ", myArray);
}
}
或者,您可以使用while循环:
function RandomDraw() {
var ri = 0;
while (myArray.length > 0) {
ri = Math.floor(Math.random() * myArray.length);
console.log("Random index to be drawn : " + ri);
// removing that index from the array :
myArray.splice(ri, 1);
console.log("myArray after a random draw : ", myArray);
}
}