只需单击一个按钮,就可以逐个列出数组元素

时间:2017-09-04 13:05:00

标签: javascript arrays

我是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;
    }
}

4 个答案:

答案 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);
    }
}