2017-09-04 101 views
0

在JavaScript中,我想從數組中隨機刪除一個項目,並在點擊按鈕的HTML中顯示此項目。 然後在下一次單擊按鈕時顯示陣列中下一個被移除的項目。但是,這似乎並沒有工作!數組中的唯一隨機項目

小提琴:http://jsfiddle.net/bs4e5g69/

document.getElementById("Button").onclick = function() { 
    var count = 3; 
    var myArray = [ 
    'A', 
    'B', 
    'C', 
    'D', 
    'E', 
    'F', 
    'G' 
    ]; 
    var tmpArrayE = myArray.slice(myArray); 
    var goE = []; 

    for (var i = 0; i < count; i++) { 
    var optionsE = Math.floor(Math.random() * tmpArrayE.length); 
    var removedE = tmpArrayE.splice(optionsE, 1); 

    goE.push(removedE[0]); 
    } 
    document.getElementById("Answer").innerHTML = goE[0]; 
} 
+0

你想從原來的列表中刪除元素?或者只是顯示列表中的隨機元素? –

+0

'slice'用於獲取數組的一部分作爲新數組。但是你想用'myArray.splice(myArray)'來做什麼? – Anusha

+0

可能已被刪除而不是goE [0] –

回答

1

您正在您的事件處理程序中重新定義您的數組,因此您的數組永遠不會爲空!

這是你更新後的代碼:

// myArray initial content, as a global variable : 
    var myArray = [ 
    'A', 
    'B', 
    'C', 
    'D', 
    'E', 
    'F', 
    'G' 
    ]; 

    // the event handler, randomly emptying myArray one at a time : 
    document.getElementById("Button").onclick = function() { 
    // check for an empty array : 
    if (myArray.length > 0) { 
     var optionsE = Math.floor(Math.random() * myArray.length); 
     var removedE = myArray.splice(optionsE, 1); 
     document.getElementById("Answer").innerHTML = removedE[0]; 
    } else { 
     alert("the array is now empty"); 
    } 
} 

Updated JSFiddle

0

您的onclick函數內聲明myArray。所以每次點擊它都會創建一個新的數組。

var myArray = [ 
 
    'A', 
 
    'B', 
 
    'C', 
 
    'D', 
 
    'E', 
 
    'F', 
 
    'G' 
 
]; 
 
document.getElementById("Button").onclick = function() { 
 
    //check if myArray length is greater than 0 
 
    if (myArray.length > 0) { 
 
    // generate random number 
 
    var optionsE = Math.floor(Math.random() * myArray.length); 
 
    // remove that element & show in div 
 
    var removedE = myArray.splice(optionsE, 1); 
 
    document.getElementById("Answer").innerHTML = removedE; 
 
    } 
 

 
}
<button id="Button"> 
 
    Start 
 
</button> 
 
<div id="Answer"> 
 
    Result 
 
</div>

+0

這是完美的謝謝你,由於某種原因,它甚至沒有跨越我的想法把數組放在函數之外!將它移到函數之外修復了所有問題,謝謝! – CharlesdeK

0

如果你喜歡用myArray副本,您需要移動這條線的回調之外,因爲你總是得到一個(新的)複製的每一個事件。

var tmpArrayE = myArray.slice(0); // myArray.slice(myArray) is wrong. 

對於使用回調原始數組,你可以只使用myArray

0

計劃A:通過改組數組開始。然後在需要的時候彈出最後一個元素。

計劃B:從0到len-1選擇一個隨機元素。將最後一個元素複製到該插槽中。然後將數組縮小一個。

如果你需要一個「洗牌」的功能,做到這一點(只有N個步驟,結果是隨機的):

for j = 0..N-1 
    swap item #j with item # rand(0..N-1)