web-dev-qa-db-ja.com

ランダムなアイテムを配列から削除し、配列が空になるまで配列から削除する方法

Jqueryまたはjavascriptを使用して配列が空になるまで、配列からランダムな項目を削除しようとしています。ランダムなアイテムを毎回コンソールアウトする必要があります。基本的に、すべての画像が作成されるまで、指定された配列からランダムな画像で要素を作成します。

これがランダムなアイテムを取得して配列から削除する私の試みですが、それは配列全体を通過しません-私は困惑しています。

"load": function(){
    var imgArray = ['brain', 'mitochondria', 'microsope', 'beaker', 'beaker-2', 'scientist', 'cell', 'atom', 'dropper'];
    function randomItem(array){
        var arrayLength = array.length+1;
        console.log(arrayLength);
        for(var i = 0;i<array.length;i++){
            var item = array[Math.floor(Math.random()*array.length)];
            array.pop(item);
            console.log(array);
        }
    }
    randomItem(imgArray);
},

これが私のコンソール出力です:

10
home.js:12 ["brain", "mitochondria", "microsope", "beaker", "beaker-2", "scientist", "cell", "atom"]
home.js:12 ["brain", "mitochondria", "microsope", "beaker", "beaker-2", "scientist", "cell"]
home.js:12 ["brain", "mitochondria", "microsope", "beaker", "beaker-2", "scientist"]
home.js:12 ["brain", "mitochondria", "microsope", "beaker", "beaker-2"]
home.js:12 ["brain", "mitochondria", "microsope", "beaker"]
13

関数 Array.prototype.pop() は最後から要素を削除します。したがって、このコンテキストでは Array.prototype.splice(indext,cnt) を使用する必要があります、

for(var i = array.length-1;i>=0;i--){
  array.splice(Math.floor(Math.random()*array.length), 1);
  console.log(array);
}

そして、配列を変更しているので、インデックスが折りたたまれないように、逆方向に走査する必要があります。

ランダムなインデックスを作成し、長さが0より大きいときに接続します。

var data = ["brain", "mitochondria", "microsope", "beaker", "beaker-2", "scientist", "cell", "atom"];

while (data.length) {
    document.write(data.splice(data.length * Math.random() | 0, 1)[0] + '<br>');
}
5
Nina Scholz

Array.prototype.pop 特定の要素ではなく、配列から最後の要素を削除します。特定のインデックスの要素を削除するには、 Array.prototype.splice を使用できます(参照: JavaScriptの配列から特定の要素を削除するにはどうすればよいですか? )。

for(var i = 0;i<array.length;i++)にも問題があります。_array.length_はアイテムを削除するたびに変化するため、配列の半分しか通過しないため、逆にループすることもできますfor ( var i = array.length; i--; ) 、つまり_array.length_は最初の反復の前に一度だけ評価されるか、whileループwhile( array.length )を使用できます。

ループを次のように変更します。

_while( array.length ) {
    var index = Math.floor( Math.random()*array.length );
    console.log( array[index] ); // Log the item
    array.splice( index, 1 ); // Remove the item from the array
}
_
2
Paul