Как отфильтровать полученные данные JSON?

#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 о, да