如何过滤获取的 JSON 数据?
How to filter fetched JSON data?
我正在尝试制作一个简单的命令,从 imgur 中提取信息,找到图像,然后从那里随机决定要显示哪张照片。我遇到的问题是我似乎无法根据特定条件过滤响应。这是相关代码:
async execute(interaction) {
const data = await fetch(
`https://imgur.com/r/${
subreddits[Math.floor(Math.random() * subreddits.length)]
}/hot.json`
)
.then((response) => response.json())
.then((body) => body.data)
const filtered = await data.filter(
(element) => 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 元素上存在的动画布尔值来过滤数据。 False 表示它不是动画,因此它是一个图像。但是 filtered
值只是 returns 一个空数组 []
。我不确定为什么它没有将所有过滤的(图像)值作为 json 数据传递。任何帮助将不胜感激。
编辑:这是进入 data
的 JSON 信息的多个元素之一。想象一下,但是来自不同帖子的 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
}
}
JSON 中的值是 false
,而不是 "false"
。只需将 == "false"
替换为 === false
。松散等号不适用于布尔值,因为 javascript 将“false”视为非空字符串,它会转换为 true。
我正在尝试制作一个简单的命令,从 imgur 中提取信息,找到图像,然后从那里随机决定要显示哪张照片。我遇到的问题是我似乎无法根据特定条件过滤响应。这是相关代码:
async execute(interaction) {
const data = await fetch(
`https://imgur.com/r/${
subreddits[Math.floor(Math.random() * subreddits.length)]
}/hot.json`
)
.then((response) => response.json())
.then((body) => body.data)
const filtered = await data.filter(
(element) => 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 元素上存在的动画布尔值来过滤数据。 False 表示它不是动画,因此它是一个图像。但是 filtered
值只是 returns 一个空数组 []
。我不确定为什么它没有将所有过滤的(图像)值作为 json 数据传递。任何帮助将不胜感激。
编辑:这是进入 data
的 JSON 信息的多个元素之一。想象一下,但是来自不同帖子的 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
}
}
JSON 中的值是 false
,而不是 "false"
。只需将 == "false"
替换为 === false
。松散等号不适用于布尔值,因为 javascript 将“false”视为非空字符串,它会转换为 true。