Javascript 从阵列中随机抽取,不后退
我想从数组中随机抽取,而不是在初始数组中抽取值。因此,基本上在每次迭代之后,数组都会收缩um 1值 我已经实现了随机抽取部分。然而,我挣扎于“放松的部分”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
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)< /代码>,它将删除并返回值。