首页 > 解决方案 > 从数组中随机绘制而不回退

问题描述

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

标签: javascript

解决方案


Javascript 的 Splice是实现这一点的绝佳功能。

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

我们可以用spliceto say: companies.splice(randomPosition, 1)[0],基本上就是:

  • randomPosition在from之后删除一个元素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内部 afor来评估它的length每次迭代是一种不好的做法,所以我将它更改为一个简化的循环。


推荐阅读