如何使用 Javascript 从 JSON 文件中选择随机对象(?)?
Posted
技术标签:
【中文标题】如何使用 Javascript 从 JSON 文件中选择随机对象(?)?【英文标题】:How do I select a random object(?) from a JSON file with Javascript? 【发布时间】: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
,并将其发布到丰富的嵌入中。我从这里做什么?
【问题讨论】:
请注意303
是一个对象的属性,而不是一个实际的对象。
这能回答你的问题吗? "Pick random property from a javascript object", "Creating an array from files in a folder and sending them randomly"
【参考方案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 服务器。您能否提供一些输入,例如您使用的服务器、浏览器和软件版本?我收到了一篇关于类似问题的帖子,昨天发布的 ***.com/questions/49675273/…
Info Across the internet:如果使用 IE,则仅在 IE11 及更高版本中支持。 您可以省略该行,它仍然可以使用,默认服务器提供 MIME输入例如。 '文本/纯文本'
另一种选择,您可以使用 if (xobj.overrideMimeType) xobj.overrideMimeType( 'application/json' ); 来保护它。 以上是关于如何使用 Javascript 从 JSON 文件中选择随机对象(?)?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JavaScript 将 JSON 文件从 HTML 页面发送到 ESP
如何从 JSON 文件读入 JavaScript? [复制]