从数组中随机绘制而无需回退

时间:2019-06-20 20:04:12

标签: javascript

我想从一个数组中随机绘制,而初始数组中没有绘制值。因此,基本上,每次迭代后,数组都会缩小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部分的任何建议。

4 个答案:

答案 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()具有两个参数:

  1. 元素索引(必需)
  2. 应删除多少个元素(可选)。如果未设置此参数,则将从该索引中删除所有项目

由于我们将对原始数组进行变异,因此您需要保留数组的原始长度。

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()));
}