如何从数组中删除随机项,然后将其从数组中删除,直到数组为空

Posted

技术标签:

【中文标题】如何从数组中删除随机项,然后将其从数组中删除,直到数组为空【英文标题】:How to remove random item from array and then remove it from array until array is empty 【发布时间】:2016-07-04 08:25:45 【问题描述】:

我正在尝试使用 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"]

【问题讨论】:

【参考方案1】:

函数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);

而且由于我们正在改变数组,所以我们必须以相反的方式遍历它,这样索引就不会被折叠。

【讨论】:

非常感谢!肯定会更深入地研究有关数组的文档。 @TravisMichaelHeller 很高兴为您提供帮助! :)【参考方案2】:

只要在长度大于零的情况下做一个随机索引和拼接。

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>');

【讨论】:

感谢您的其他选择。我没有考虑过使用 while 循环,因为现在我想到了它,这很有意义。【参考方案3】:

Array.prototype.pop 从数组中删除最后一个元素,而不是特定元素。要删除特定索引处的元素,您可以使用Array.prototype.splice(参见:How do I remove a particular element from an array in JavaScript?)。

for(var i = 0;i&lt;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

【讨论】:

感谢您抽出宝贵时间提供帮助。我只是告诉 Nina,对于我正在寻找的功能来说,while 循环会是更好的选择。 刚看到你的更新,谢谢你的解释。从来没有想过反向循环。有一段时间不用搞乱数组了,但我显然需要读回它们,因为我缺乏知识。 @TravisMichaelHeller 您也可以像以前那样循环前进,但先将数组长度放入变量中:var numItems = array.length; 然后for(var i = 0;i&lt;numItems;i++),因为array.length 在您删除元素时会发生变化,但变量不会受到影响。

以上是关于如何从数组中删除随机项,然后将其从数组中删除,直到数组为空的主要内容,如果未能解决你的问题,请参考以下文章

如何从javascript中的数组中删除单个实例? [复制]

从数组中删除一个元素,即在一个对象内

基于 SegmentedControl 有条件地重新加载 UITableView

在采摘时随机播放数组或随机化索引?

我已使用 selenium web 驱动程序 JAVA 将产品添加到手推车中,然后将其从购物车中删除。我如何断言产品是不是被移除?

从 NSMutableArray 中删除随机项