#javascript #node.js #discord.js #node-fetch
Вопрос:
Я пытаюсь создать простую команду, которая извлекает информацию из imgur, находит изображения и оттуда случайным образом решает, какую фотографию показывать. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу отфильтровать ответы на основе определенных критериев. Вот соответствующий код:
async execute(interaction) { const data = await fetch( `https://imgur.com/r/${ subreddits[Math.floor(Math.random() * subreddits.length)] }/hot.json` ) .then((response) =gt; response.json()) .then((body) =gt; body.data) const filtered = await data.filter( (element) =gt; element.animated == "false" ); console.log(filtered); const selected = data[Math.floor(Math.random() * data.length)]; await interaction.reply({ content: `https://imgur.com/${selected.hash}${selected.ext.replace( /?.*/, "" )}`, }); }
Как вы можете видеть, я попытался отфильтровать данные на основе анимированного логического значения, присутствующего в каждом элементе JSON. Ложь означает, что он не анимирован, следовательно, это изображение. Но filtered
значение просто возвращает пустой массив []
. Я не уверен, почему он не передает все отфильтрованные значения (изображения) в виде данных json. Любая помощь будет признательна.
ИЗМЕНИТЬ: Вот один из множества элементов информации JSON, которая входит в data
. Представьте себе это, но 20 раз с разных постов:
{ id: 5987473707, hash: 'jV66SOE', author: 'RushVoidStaff', account_id: null, account_url: null, title: 'Meet these three brothers! Wheels, Judas and Porridge', score: 73947, size: 1015100, views: '111639', is_album: false, album_cover: null, album_cover_width: 0, album_cover_height: 0, mimetype: 'image/jpeg', ext: '.jpg', width: 2048, height: 1536, animated: false, looping: false, reddit: '/r/kittens/comments/dmtfvc/meet_these_three_brothers_wheels_judas_and/', subreddit: 'kittens', description: '#kittens #aww', create_datetime: '2019-10-25 06:31:29', bandwidth: '105.54 GB', timestamp: '2019-10-25 06:40:10', section: 'kittens', nsfw: false, prefer_video: false, video_source: null, video_host: null, num_images: 1, in_gallery: false, favorited: false, adConfig: { safeFlags: [Array], highRiskFlags: [], unsafeFlags: [], wallUnsafeFlags: [], showsAds: true } }
Комментарии:
1. Зачем все эти ожидающие и асинхронные? Пожалуйста, опубликуйте также пример данных
2. пожалуйста, добавьте a
console.log(data); // output is ....
после инициализации этой переменной, иначе данные могут быть любыми, у нас нет никаких подсказок3. @mplungjan @Saren Я добавил пример значения данных JSON, которое присваивается
data
константе.4. @Koto атрибут анимированный, похоже, не существует на примере того, что вы нам дали, вы хотите
filtered
быть массивом данных, где анимированных не существует ?
Ответ №1:
Значение в JSON равно false
, нет "false"
. Просто замените == "false"
на === false
. Свободные равенства не работают с логическими значениями, так как javascript видит «false» как непустую строку, которая преобразуется в true.
Комментарии:
1. По какой-то причине? С чего бы это
"false" == false
? Непустая строка является истинным значением, поэтому этого не может бытьfalse
.2. @ZsoltMeszaros о, да