JQuery:合并多个JSON结果

情况:用户希望使用Youtube的JSON API在JQuery站点中导入Youtube播放列表。

问题: Youtube只返回前50个条目,但播放列表的长度可以超过100个(长度由JSON响应中的’totalItems’给出)。 所有条目都需要合并为1个对象,最后需要将其推送到输出函数中。

条目1-50: http : //gdata.youtube.com/feeds/api/playlists/84780DAC99E1A285? v = 2 &alt = jsonc&max-results = 50&start-index = 1

条目50-100: http : //gdata.youtube.com/feeds/api/playlists/84780DAC99E1A285? v = 2 & alt = jsonc& max- results = 50& start- index = 50

当前代码:

function fetchPlaylist(pid) { var the_url = 'http://gdata.youtube.com/feeds/api/playlists/' + encodeURIComponent(pid) + '?v=2&alt=jsonc&max-results=50'; $.ajax({ type: "GET", url: the_url, dataType: "jsonp", success: function (responseData, textStatus, XMLHttpRequest) { if (responseData.data != null) { if (responseData.data.items) { outputFunction(responseData.data.items); } else { console.log('No results for playlist: "' + pid + '"'); } } } }); } 

题:

  1. 在收到所有条目之前,重复JSON调用的最有效方法是什么?

  2. 如何将不同的响应组合成一个对象?

我尝试过的:

使用http://api.jquery.com/jQuery.extend/进行合并,由于复杂/嵌套情况而陷入困境

由于您只需要作为数组的项目,因此可以在重复函数中使用$.merge()

 function fetchPlaylist(pid, start, items) { items = items || []; start = start || 0; var the_url = 'http://gdata.youtube.com/feeds/api/playlists/' + encodeURIComponent(pid) + '?v=2&alt=jsonc&max-results=50'; $.ajax({ type: "GET", url: the_url, data: { start: start }, dataType: "jsonp", success: function(responseData, textStatus, XMLHttpRequest) { if (responseData.data != null) { if (responseData.data.items) { $.merge(items, responseData.data.items); //add to items if (responseData.data.totalItems > start + 50) { fetchPlaylist(pid, start + 50, items); } else { outputFunction(items); } } else { console.log('No results for playlist: "' + pid + '"'); } } } }); } 

你可以在这里尝试一下 ,你只需用播放列表ID来调用它,如下所示:

 fetchPlaylist("84780DAC99E1A285");​ 

每次请求完成时,我们会看到youtube返回的totalItems是否高于我们请求的数量加上50,如果是这种情况,再次获取,添加这些结果……如果没有,那么我们就完成了并将组合数组传递给outputFunction()

  1. 您应该能够使用start-index参数从谷歌调用下一组结果。 您可以递归调用fetchPlaylist()方法,同时更改每个调用的start-index,直到获得所有调用。

  2. 使用.extend()来合并结果

由于我的声誉,我无法发表任何评论。 但是你不应该使用count(responseData.data.items)来增加+50变量来覆盖YouTube API的变化吗?

我知道使用max-results=50调用JSON请求,但是他们可以开始将此限制为较少数量的项目。