javascript - 从数组中随机抽取,无需后退

标签 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)}`)
}

关于如何实现无需放松部分的任何建议。

最佳答案

Javascript's Splice是实现这一目标的一个很棒的函数。

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

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

  • 公司中删除randomPosition之后的一个元素。
  • 这将返回一个删除了元素的数组,因此我们使用[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:在每次迭代都会评估其长度for中修改array是一种不好的做法,所以我将其更改为一个简化的循环。

关于javascript - 从数组中随机抽取,无需后退,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56693143/

相关文章:

javascript - 如何使用 jquery 或 javascript 重新定位 JSON 中对象的键

javascript - .each() 中的下一个元素

javascript - Javascript 或 PHP for 循环中是否有 "superbreak"?

javascript - kogrid 过滤器不工作 - 与 plunker

php - 在 PHP 中加密部分 HTML 并在 JavaScript 中解密

javascript - 当 Socket.io 发出完成时运行函数

Javascript/Flash 小型跨浏览器声音播放器

javascript - 在 Javascript 中设置值会导致 Controller 的空属性 - MVC

javascript - 通过两个数据属性和排除数据属性获取一个 div

javascript - AG-GRID 中的单元合并