组合响应.JSON数据从两个独立的Spotify API查询?



我对Javascript/web开发非常陌生,并试图从Spotify API中提取数据以用于网站。执行两个单独的查询来提取我需要的数据,并尝试将两个响应组合起来。Json对象使用

const data = Object.assign(source, target).

然而,当我这样做时,只有第二个对象(目标)被分配给数据并出现在我的web应用程序中。我相信data2中的第一个条目与data1(键,值)中的最后一个条目相同,不确定这是否可能导致问题,但从我所读到的,data2应该只是覆盖data1中的该条目。考虑将这些响应对象分开,并尝试在进一步的步骤中组合数据(组合两个映射),但不太确定用于此过程的正确语法,因为我在那里也不断得到错误。任何帮助都会非常感激!下面的代码。

const fetchTopSongs = async (duration) => {
const response1 = await window.fetch('https://api.spotify.com/v1/me/top/tracks?' +
querystring.stringify({
limit: 50,
offset: 0,
time_range: duration,
}), {
method: 'GET',
headers: {
Authorization: 'Bearer ' + accessToken,
},
});
const data1 = await response1.json()
const response2 = await window.fetch('https://api.spotify.com/v1/me/top/tracks?' +
querystring.stringify({
limit: 50,
offset: 49, 
time_range: duration,
}), {
method: 'GET',
headers: {
Authorization: 'Bearer ' + accessToken,
},
});
const data2 = await response2.json()
const data = Object.assign(data1,data2)
// const map1 = data1.items.map(song => song.name)
// const map2 = data2.items.map(song => song.name)
// const map = new Map([...map1,...map2])
// setTopSongs(map)
setTopSongs(data.items.map(song => song.name))
}

最好有一个响应示例,但是基于搜索api

看起来响应是这样的:

{
"tracks": {
href: foo,
items: [],
total: bar
}
}

说了,我认为你需要合并items数组

const result = [...data1.items, ...data2.items]

创建一个接受3个参数的自定义函数,并将所有数据合并在其中,然后返回结果。

在这里调试结果以确保它已经在这里了使用log(response11);但当使用await时,它将返回在不防守或错误中,它不在那里,它会在某个点所以考虑这样做,因为它是一个承诺,在这里解析为一个JavaScript对象

const data1 = await response1.json().then(()=>{
console.log(data1)
}).catch(e => console.log(e))
//also here do it with the same way
const data2 = await response2.json().then(()=> {
const data = Object.assign(data1,data2)
return   setTopSongs(data.items.map(song => song.name))
}).catch(e => console.log(e))
}

这里你可以用multiable的方式来做你可以看到这个高将多个对象组合为一个的速率答案你可以用

const data = Object.assign(data1,data2)

可以使用

const allRules = Object.assign({}, data1,data2 , etc);

(见MDN JavaScript参考)

或使用:ECMAScript 2018标准方法

对象扩展语法注意,allRules现在是data1和data2的并集。data2中的属性将覆盖data1中的属性。

let allRules = {...data1, ...data2 };

或者如我之前所说,你可能需要在这样的情况下使用自定义函数来合并那些json对象当您需要合并两个对象而不覆盖重叠的对象键

时,也可以使用此方法。
const allRules  = (...objects) => {
return objects.reduce((prev, next) => {
Object.keys(prev).forEach(key => {
next[key] = { ...next[key], ...prev[key] }
})
return next
})
}

在这里需要更多的例子SOF问题和答案

最后,你能否提供更多的信息,当你试图这样做时,哪个错误发生了,并响应日志有一个很好的视野,你到底需要什么

最新更新