В моем 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 [JS]](https://i.imgur.com/WsjO6zJb.png)


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.info(randomValue)Вы можете выбрать случайное имя, например:
// 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]
// ...
Это можно сделать в два этапа.
Загрузка файла Json с использованием Javascript и локального сервера
1> Создайте файл Json, назовите его botNames.json, добавьте свои данные.
Примечание. Файлы .json могут содержать только литералы Json Object, Array или 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.info(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
У меня это работает, я пробовал с серверами python и nodeJs, в Chrome, IE. Можете ли вы указать, какие версии сервера, браузера и программного обеспечения вы используете? Получил сообщение о подобной проблеме, вчера отправил stackoverflow.com/questions/49675273/…
Информация В Интернете: При использовании IE он поддерживается только в IE11 и более поздних версиях. Вы можете опустить эту строку, она все равно будет работать, с сервером по умолчанию, предоставленным типом MIME, например. 'текст / простой'
Еще одна альтернатива, которую вы можете защитить, используя если (xobj.overrideMimeType) {xobj.overrideMimeType ('приложение / json'); }
Обратите внимание, что
303- это свойство объекта, а не реальный объект.