【问题标题】:Creating a Random javascript array from an HTML input field从 HTML 输入字段创建随机 javascript 数组
【发布时间】:2021-10-03 15:26:49
【问题描述】:

我有基本的 HTML 表单,要求输入 1 到 10 之间的数字。基于该数字,我想创建一个新数组。目前,代码显示了新创建数组的警告框,但最终它将是一个显示结果的表格。当前数组有 10 个值,我希望它随机生成一个新数组。我想我拥有它,只是缺少一件事或几件事。

function createRandomArray () {

var numOfGamesElement = document.getElementById("numOfGames");
var numOfGames = numOfGamesElement.value;

var gamesPicked [];

  const boardGames = ["UNO", "Monopoly", "Clue", "Pandemic", "Catan", "Articulate!", "Codenames", "Fallout", "Candy Land", "Scrabble"];


let gamesPicked = boardGames[Math.floor(Math.random() * boardGames.length)];

for(let i = 0; i < numOfGames; i++){
  gamesPicked.push(i);
}
  alert(gamesPicked.join("\n"));
//createTable(gamesPicked)
}

【问题讨论】:

    标签: javascript html arrays function


    【解决方案1】:

    这可行,但没有解决随机函数可以选择重复项的问题。

    <!DOCTYPE html>
    <head>
    <script>
    function createRandomArray () {
        var numOfGamesElement = document.getElementById("numOfGames");
        var numOfGames = numOfGamesElement.value;
    
        const boardGames = ["UNO", "Monopoly", "Clue", "Pandemic", "Catan", "Articulate!", "Codenames", "Fallout", "Candy Land", "Scrabble"];
    
        var gamePicked;
        var gamesPicked = {};
        for(let i = 0; i < numOfGames; i++){
          gamePicked = boardGames[Math.floor(Math.random() * boardGames.length)];
          gamesPicked[i] = gamePicked;
          alert(gamesPicked[i]);
        }
        // could build table here
    }
    </script>
    </head>
    
    <body>
    <label>Number of games (1 to 10):
    <input id="numOfGames">
    </label>
    <button onclick="createRandomArray()">Click Me</button>
    </body>
    

    【讨论】:

      【解决方案2】:

      一个问题是您可能会在随机选择的游戏数组中得到重复项。最好对数组进行洗牌(随机化),然后只获取 X 个项目的slice,就像这样。请注意,我将 numOfGames 值从字符串更改为数字,方法是在其前面加上 +

      /* Randomize array in-place using Durstenfeld shuffle algorithm */
      function shuffleArray(array) {
          for (var i = array.length - 1; i > 0; i--) {
              var j = Math.floor(Math.random() * (i + 1));
              var temp = array[i];
              array[i] = array[j];
              array[j] = temp;
          }
      }    
      const boardGames = ["UNO", "Monopoly", "Clue", "Pandemic", "Catan", "Articulate!", "Codenames", "Fallout", "Candy Land", "Scrabble"];    
      function createRandomArray () {
         let numOfGames = +document.getElementById("numOfGames").value || 0;
         let gamesPicked = shuffleArray(boardGames).slice(0, numOfGames)
         alert(gamesPicked.join("\n"));
      }
      

      【讨论】:

        【解决方案3】:

        你可以像这样使用 vanilla JS 来做到这一点

        function samples(array, length) {
            var samplesSet = new Set();
            if (array.length < length) {
                throw Error("requested length is greater than given array");    
            }
            while(samplesSet.size < length) {
                samplesSet.add(array[Math.floor(Math.random() * array.length)]);
            }
            return [...samplesSet];
        }
        function createRandomArray () {
        
        var numOfGamesElement = document.getElementById("numOfGames");
        var numOfGames = numOfGamesElement.value;
        
          const boardGames = ["UNO", "Monopoly", "Clue", "Pandemic", "Catan", "Articulate!", "Codenames", "Fallout", "Candy Land", "Scrabble"];
        
        
        let gamesPicked = samples(boardGames, numOfGames);
          alert(gamesPicked.join("\n"));
        //createTable(gamesPicked)
        }
        

        或者像这样使用lodashsampleSize

        let _ = require('lodash');
        
        function createRandomArray () {
        
        var numOfGamesElement = document.getElementById("numOfGames");
        var numOfGames = numOfGamesElement.value;
        
          const boardGames = ["UNO", "Monopoly", "Clue", "Pandemic", "Catan", "Articulate!", "Codenames", "Fallout", "Candy Land", "Scrabble"];
        
        
        let gamesPicked = _.sampleSize(boardGames, numOfGames);
          alert(gamesPicked.join("\n"));
        //createTable(gamesPicked)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-26
          • 2020-02-27
          • 2021-08-06
          • 1970-01-01
          • 1970-01-01
          • 2013-06-18
          • 1970-01-01
          相关资源
          最近更新 更多