javascript - 从数组中的多个中查找百分比并偶然返回整个对象

标签 javascript

我目前正在尝试为奖品制作一个幸运抽奖选择器,我有一个对象,我想以某种方式将其转换为相互依赖的百分比。我在网上查看了其他解决方案,但在查看数组内部并偶然将整个对象返回内部时遇到了麻烦

示例中的最大百分比将是 100%,每个数量将计算出正确的百分比,即数量:22 最有可能被选中,数量:1 是最稀有的,依此类推

        { tshirts: [
            { "tshirtName":"Green Shirt", "qty": 1, },
            { "tshirtName":"Blue Shirt", "qty": 2, },
            { "tshirtName":"Red Shirt", "qty": 7, },
            { "tshirtName":"Yellow Shirt", "qty": 22, },
        ]}

目前我犯了错误,只是做了以下事情:

const randomChoice = Math.floor(Math.random() * prizes.tshirts.length);
console.log('Your prize is ' + prizes.tshirts[randomChoice].tshirtName);

但这并没有考虑到每个数量所需的不同百分比,它使每个数量都有 25% 的机会

非常感谢任何帮助,谢谢

最佳答案

在 1 和总数量之和之间找到一个随机数,并以此为基础得到一个元素。

let prizes = {"tshirts":[{"tshirtName":"Green Shirt","qty":1},{"tshirtName":"Blue Shirt","qty":2},{"tshirtName":"Red Shirt","qty":7},{"tshirtName":"Yellow Shirt","qty":22}]};

// variable for total quantity sum
let total = 0;

// create an array to keep reference of maximum value of random num
let range = prizes.tshirts.reduce((arr, { qty }, i) => {
  arr[i] = (total += qty);
  return arr;
}, [])

for (let i = 0; i < 100; i++) {

  // get a random number between 1 to total
  const randomChoice = Math.floor(Math.random() * total) + 1;

  // get index based on the range array  values
  const index = range.findIndex(v => v >= randomChoice)

  console.log('Your prize is ' + prizes.tshirts[index].tshirtName, randomChoice);
}

关于javascript - 从数组中的多个中查找百分比并偶然返回整个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55616022/

相关文章:

javascript - 如何过期或重置地理位置

Javascript 返回 JSON 不起作用

javascript - 如何在松露迁移脚本中使用松露部署程序嵌套 promise

javascript - 克隆最后一列并将其添加到同一个表中 - jQuery

javascript - 内容类型 image/png ajax

Javascript 多个函数与更大的函数

javascript - 如何防止视频阵列播放同一视频两次?

javascript - 如何在 JavaScript 中获取此对象的类型名称?

javascript - Atom 操作编辑器 DOM

javascript - Angular 确保在打开另一个开关时关闭开关