【发布时间】:2021-08-24 12:59:31
【问题描述】:
我正在尝试创建一个小项目来处理 API 调用。我创建了一个异步,它使用 MusicBrainz API 恢复有关曲目的信息。你可以点击那里查看请求的结果:https://musicbrainz.org/ws/2/recording/5935ec91-8124-42ff-937f-f31a20ffe58f?inc=genres+ratings+releases+artists&fmt=json(我选择了从 AC/DC 到地狱的高速公路)。
这是我在重新处理我的请求的 JSON 响应时得到的结果:
export const GET_JSON = async function (url) {
try {
const res = await Promise.race([
fetch(url),
timeout(CONSTANTS.TIMEOUT_SEC),
]);
const data = await res.json();
if (!res.ok) throw new Error(`${data.message} (${res.status})`);
return data;
} catch (err) {
throw err;
}
};
export const loadTrackDetail = async function (id) {
try {
const trackData = await GET_JSON(
encodeURI(
`${CONSTANTS.API_URL}${id}?inc=genres+artists+ratings+releases&fmt=json`
)
);
details.trackDetails = {
trackTitle: trackData.title,
trackID: trackData.id,
trackLength: trackData.length ?? "No duration provided",
trackArtists: trackData["artist-credit"].length
? trackData["artist-credit"]
: "No information on artists",
trackReleases: trackData["releases"].length
? trackData["releases"]
: "No information on releases",
trackGenres: trackData["genres"].length
? trackData["genres"]
: "No information on genres",
trackRating: trackData.rating.value ?? "No rating yet",
};
console.log(details.trackDetails);
} catch (err) {
throw err;
}
现在这还不错,但是 release 属性例如是一个对象数组(每个对象都是存在轨道的特定版本)但是对于每个版本,我想“减少”仅反对其 id 和 title。其余的我不感兴趣。此外,我想说的是,例如,如果发布的标题与之前已经存在的标题相似,则不会将整个对象添加到新数组中。 我曾考虑过做一个 foreach 函数,但我只是不知道如何正确编写它,如果它实际上可能的话,如果我应该使用 array.map 例如,或其他迭代方法。 如果有人有一些在纯 JS(不是 Jquery !)中执行此操作的好方法,高效且干净,将不胜感激!
干杯
【问题讨论】:
-
你的 API 结果不是一个数组而是一个对象。您实际上想要获得哪个
id和name? -
是的,抱歉,我的意思是响应的“releases”属性返回一个数组。我编辑了问题!
-
我没有看到
name,但id仅在第一级的每个数组中。 -
该死,我明白你的意思,这也是@peinearydeveloment 在下面所说的。我编辑了我的问题:我的意思是每个版本的
title,而不是它的名称......抱歉造成混淆。
标签: javascript json api object