Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从阵列中随机抽取,不后退_Javascript - Fatal编程技术网

Javascript 从阵列中随机抽取,不后退

Javascript 从阵列中随机抽取,不后退,javascript,Javascript,我想从数组中随机抽取,而不是在初始数组中抽取值。因此,基本上在每次迭代之后,数组都会收缩um 1值 我已经实现了随机抽取部分。然而,我挣扎于“放松的部分” const arr=[{ 名称:“公司1”, 符号:“C1”, }, { 名称:“公司2”, 符号:“C2”, }, { 名称:“公司3”, 符号:“C3”, }, { 名称:“公司4”, 符号:“C4”, }, ] for(设i=0;i0){ const randomPosition=Math.floor(Math.random()*co

我想从数组中随机抽取,而不是在初始数组中抽取值。因此,基本上在每次迭代之后,数组都会收缩um 1值

我已经实现了随机抽取部分。然而,我挣扎于“放松的部分”

const arr=[{
名称:“公司1”,
符号:“C1”,
},
{
名称:“公司2”,
符号:“C2”,
},
{
名称:“公司3”,
符号:“C3”,
},
{
名称:“公司4”,
符号:“C4”,
},
]
for(设i=0;i
是实现这一点的一个重要功能

因为您已经完成了“随机”部分,所以我们只需要从数组中提取元素,而不只是打印它

我们可以使用
splice
来表示:
companys.splice(randomPosition,1)[0]
,它基本上是:

  • 公司
    中删除
    随机定位
    后的一个元素
  • 这将返回一个包含已删除元素的
    数组
    ,因此我们使用
    [0]
    拼接
    返回中获取第一个元素
这将导致如下结果:

const公司=[
{名称:'Company 1',符号:'C1'},
{名称:'Company 2',符号:'C2'},
{名称:'Company 3',符号:'C3'},
{名称:'Company 4',符号:'C4'},
]
while(companys.length>0){
const randomPosition=Math.floor(Math.random()*companys.length)
常量removedElement=公司拼接(随机位置,1)[0]
console.log(removedElement)
}

console.log('companys is empty:',companys)
您只需添加
.splice()
方法即可从阵列中删除该项。您也不应该重新计算循环中的数组长度,因为您正在从中删除项目,因此该数字将减少,并比您认为的更早结束循环

const arr=[{
名称:“公司1”,
符号:“C1”,
},
{
名称:“公司2”,
符号:“C2”,
},
{
名称:“公司3”,
符号:“C3”,
},
{
名称:“公司4”,
符号:“C4”,
},
]
for(设i=0,iLength=arr.length;i}
这里涉及拼接的其他答案也可以,但是为了提高效率和简化编码,我可以建议一种不同的方法吗?如果不是从排序的数组中选择随机索引,而是洗牌数组,然后像洗牌牌一样从顶部弹出,会怎么样?您可以通过使用一个仅随机返回1或-1的比较器函数对数组进行“排序”来洗牌数组

arr.sort(() => Math.random() >= 0.5 ? 1 : -1);
while (arr.length > 0) {
 console.log(JSON.stringify(arr.pop()));
}

如果希望对原始数组进行变异,可以使用
.splice()

.splice()
采用两个参数:

  • 元素索引(必需)
  • 应删除多少个元素(可选)。如果未设置此参数,则将删除该索引中的所有项
  • 您需要保持数组的原始长度,因为我们将对原始数组进行变异

    const arr=[{
    名称:“公司1”,
    符号:“C1”,
    },
    {
    名称:“公司2”,
    符号:“C2”,
    },
    {
    名称:“公司3”,
    符号:“C3”,
    },
    {
    名称:“公司4”,
    符号:“C4”,
    },
    ];
    常数arrLength=arr.length;
    for(设i=0;i}
    那么,是否绘制一个随机项并将其从数组中移除?我不确定我是否理解“休息”部分。@TylerRoper完全正确!考虑使用<代码> AR.SPLICE(…)(0)< /代码>,它将删除并返回值。