我想从一个数组中随机绘制,而初始数组中没有绘制值。因此,基本上,每次迭代后,数组都会缩小um 1值。
我已经实现了随机抽奖。但是我为“后退部分”而苦恼。
const arr = [{
name: 'Company1',
symbol: 'C1',
},
{
name: 'Company2',
symbol: 'C2',
},
{
name: 'Company3',
symbol: 'C3',
},
{
name: 'Company4',
symbol: 'C4',
},
]
for (let i = 0; i < arr.length; i++) {
const value = arr[Math.floor(Math.random() * arr.length)]
console.log(`${i} draw: ${JSON.stringify(value)}`)
}
关于如何实现without laying back
部分的任何建议。
答案 0 :(得分:2)
Javascript's Splice是实现此目的的强大功能。
由于您已经完成了“随机”部分,因此我们只需要从数组中提取元素,而不仅仅是打印它即可。
我们可以使用splice
来表示:companies.splice(randomPosition, 1)[0]
,基本上是:
randomPosition
中删除companies
之后的一个元素。 array with removed elements
,因此我们使用[0]
从splice
返回中获取第一个。这将导致如下结果:
const companies = [
{ name: 'Company 1', symbol: 'C1' },
{ name: 'Company 2', symbol: 'C2' },
{ name: 'Company 3', symbol: 'C3' },
{ name: 'Company 4', symbol: 'C4' },
]
while (companies.length > 0) {
const randomPosition = Math.floor(Math.random() * companies.length)
const removedElement = companies.splice(randomPosition, 1)[0]
console.log(removedElement)
}
console.log('companies is empty: ', companies)
PS:在array
内修改for
并在每次迭代中评估其length
的情况下,这是一个坏习惯,因此我将其更改为简化的循环。
答案 1 :(得分:0)
您只需要添加.splice()
方法即可从数组中删除该项。您也不应重新评估循环中的数组长度,因为您要从中删除项目,因此该数目会减少,并且循环比您更早结束。
const arr = [{
name: 'Company1',
symbol: 'C1',
},
{
name: 'Company2',
symbol: 'C2',
},
{
name: 'Company3',
symbol: 'C3',
},
{
name: 'Company4',
symbol: 'C4',
},
]
for (let i = 0, iLength = arr.length; i < iLength ; i++) {
const randomIndex = Math.floor(Math.random() * arr.length)
console.log(`${i} draw: ${JSON.stringify(arr.splice(randomIndex, 1)[0])}`)
}
答案 2 :(得分:0)
如果您希望原始数组发生突变,则可以使用.splice()
。
.splice()
具有两个参数:
由于我们将对原始数组进行变异,因此您需要保留数组的原始长度。
const arr = [{
name: 'Company1',
symbol: 'C1',
},
{
name: 'Company2',
symbol: 'C2',
},
{
name: 'Company3',
symbol: 'C3',
},
{
name: 'Company4',
symbol: 'C4',
},
];
const arrLength = arr.length;
for (let i = 0; i < arrLength; i++) {
const index = Math.floor(Math.random() * arr.length);
const value = arr[index];
console.log(`${i} draw: ${JSON.stringify(value)}`)
arr.splice(index, 1);
}
答案 3 :(得分:-1)
这里涉及拼接的其他答案将起作用,但是为了提高效率和简化编码,我是否可以建议使用其他方法?如果不是从已排序的数组中选择随机索引,而是将数组重新排列,然后像重新排列的纸牌一样从顶部弹出,该怎么办?您可以使用比较器函数对数组进行“排序”,以随机排序数组,该函数只是随机返回1或-1。
arr.sort(() => Math.random() >= 0.5 ? 1 : -1);
while (arr.length > 0) {
console.log(JSON.stringify(arr.pop()));
}