【问题标题】:How do I select a random object(?) from a JSON file with Javascript?如何使用 Javascript 从 JSON 文件中选择随机对象(?)?
【发布时间】:2018-09-16 00:17:11
【问题描述】:

在我正在制作的 Discord Bot 中,它需要从 JSON 文件中选择一个随机对象。我目前的代码是这样的:

    function spawn(){
        if (randomNum === 24) return
        const name = names.randomNum
        const embed = new Discord.RichEmbed()
        .setTitle(`${name} has been found!`)
        .setColor(0x00AE86)
        .setThumbnail(`attachment://./sprites/${randomNum}.png`)
        .setTimestamp()
        .addField("Quick! Capture it with `>capture`!")
        msg.channel.send({embed});
    }

JSON 文件如下所示:

{
    "311": "Blargon",
    "310": "Xryzoz",
    "303": "Noot",
    "279": "",
    "312": "Arragn",
    "35": "Qeud",
    ...
}

我希望它随机选择其中一个,例如303,并将其发布到丰富的嵌入中。我从这里做什么?

【问题讨论】:

标签: javascript node.js discord discord.js


【解决方案1】:

您可以像这样选择一个随机名称:

// Create array of object keys, ["311", "310", ...]
const keys = Object.keys(names)

// Generate random index based on number of keys
const randIndex = Math.floor(Math.random() * keys.length)

// Select a key from the array of keys using the random index
const randKey = keys[randIndex]

// Use the key to get the corresponding name from the "names" object
const name = names[randKey]

// ...

【讨论】:

    【解决方案2】:

    const jsonData = {
        "311": "Blargon",
        "310": "Xryzoz",
        "303": "Noot",
        "279": "",
        "312": "Arragn",
        "35": "Qeud",
    }
    const values = Object.values(jsonData)
    
    const randomValue = values[parseInt(Math.random() * values.length)]
    
    console.log(randomValue)

    【讨论】:

      【解决方案3】:

      这可以分两步完成

      使用 Javascript 和本地服务器加载 Json 文件

      1> 创建一个 Json 文件,将其命名为 botNames.json,添加您的数据。

      注意:.json 文件只能包含 Json 对象、数组或 Json 文字

      {
          "311": "Blargon",
          "310": "Xryzoz",
          "303": "Noot",
          "279": "",
          "312": "Arragn",
          "35": "Qeud"
      }
      

      使用 XMLHttpRequest() 加载数据,您可以使用下面的函数加载 .json 文件,传递回调函数和路径作为参数。

      function loadJSON(callback,url) {   
        var xobj = new XMLHttpRequest();
        xobj.overrideMimeType("application/json");
        xobj.open('GET', url, true); 
        xobj.onreadystatechange = function () {
              if (xobj.readyState == 4 && xobj.status == "200") {
                callback(xobj.responseText);
              }
        };
        xobj.send(null);
      }
      

      要生成随机索引,您可以使用以下表达式

      Math.floor(lowerLimt + (upperLimit - lowerLimit+1)*Math.Random())

      这将为您提供 [lowerLimit,upperLimit)

      范围内的值

      注意:这是可能的,因为 Math.random()[0,1)

      范围内生成一个小数>

      您的回调函数将是

      function callback1(response){
              var botNames = JSON.parse(response)
              var keys = Object.keys(botNames);
              var randomProperty = keys[Math.floor(keys.length*Math.random())]
              var botName = botNames[randomProperty]
              console.log(botName);
          }
      

      您可以在代码中使用上述概念作为

      function loadJSON(callback,url) {   
          var xobj = new XMLHttpRequest();
          xobj.overrideMimeType("application/json");
          xobj.open('GET', url, true); 
          xobj.onreadystatechange = function () {
                  if (xobj.readyState == 4 && xobj.status == "200") {
                  // sending the resonse to your callback
                  callback(xobj.responseText);
                  }
          };
          xobj.send(null);
      }
      
      function spawn(){
              loadJSON(function(response){
                //This is your callback function
      
                var names = JSON.parse(response)
                var keys = Object.keys(botNames);
                var randomNum = keys[Math.floor(keys.length*Math.random())]
                  
                if (randomNum === 24) return
                const name = names[randomNum]
                const embed = new Discord.RichEmbed()
                .setTitle(`${name} has been found!`)
                .setColor(0x00AE86)
                .setThumbnail(`attachment://./sprites/${randomNum}.png`)
                .setTimestamp()
                .addField("Quick! Capture it with `>capture`!")
                msg.channel.send({embed});
              },'/PATH_TO_YOUR_JSON/botNames.json')
          }

      【讨论】:

      • 我尝试了你在那里所做的,我得到了这个错误:TypeError: xobj.overrideMimeType is not a function
      • 它适用于我,我尝试在 Chrome、IE 中使用 python 和 nodeJs 服务器。您能否提供一些输入,例如您使用的服务器、浏览器和软件版本?我收到了一篇关于类似问题的帖子,昨天发布的 stackoverflow.com/questions/49675273/…
      • Info Across the internet:如果使用 IE,则仅在 IE11 及更高版本中支持。 您可以省略该行,它仍然可以使用,默认服务器提供 MIME输入例如。 '文本/纯文本'
      • 另一种选择,您可以使用 if (xobj.overrideMimeType) { xobj.overrideMimeType( 'application/json' ); 来保护它。 }
      猜你喜欢
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 2020-05-01
      相关资源
      最近更新 更多