此javascript代码调用spotify api,并返回一个包含给定艺术家所有专辑的表格。该表中的第5列包含一个名为popularity
的值。我需要按第五列对表格进行排序,并根据popularity
值打印出前5行(相册)。
$(document).ready(function () {
$("#searchbutton").click(function () {
search();
});
function search() {
var query1 = document.getElementById('querybox').value;
$.get("https://api.spotify.com/v1/search?q=" + query1 + "&type=artist", function (data) {
//alert(data.artists.items[0].id);
getSeveralAlbums(data.artists.items[0].id);
});
}
function getSeveralAlbums(artistid) {
//alert(artistid);
$.getJSON("https://api.spotify.com/v1/artists/" + artistid + "/albums?album_type=album",
function (json) {
//bob = json;
//console.log(json);
for (var i = 0; i < json.items.length; i++) {
getAlbumInfo(json.items[i].href);
//console.log(json.items[i].href);
}
});
}
function getAlbumInfo(albumhref) {
//alert("a");
//console.log("a");
$(document).ready(function () {
$.getJSON(albumhref,
function (json) {
var tr;
// i<json.length
// Sort the array first by popularity. And then create a for loop and print the first five.
tr = $('<tr/>');
tr.append("<td>" + json.name + "</td>"); // Album Name
tr.append("<td>" + json.artists[0].name + "</td>"); // Artist Name
tr.append("<td>" + json.release_date + "</td>"); // Release Date
tr.append("<td>" + json.tracks.total + "</td>"); // Number of Tracks
tr.append("<td>" + json.popularity + "</td>"); // Popularity
$('table').append(tr);
//alert("table compiled");
//alert("Table done");
});
});
}
});
所以我的问题是。获得前5张专辑的最有效方法是什么?我已经拥有了数据,我只需要提供该数据的特定子部分。注意:包含所有艺术家专辑列表的API网址不包含所需的popularity
数据。
尝试1: 我尝试创建一个2D数组并存储albumhref(api链接返回json,其中包含单个专辑的数据,包括流行度),以及阵列单行中每个专辑的相应流行度。然后根据流行度对数组进行排序,理想情况下也会对albumhref进行排序。然后使用for循环运行GET api调用,该调用将获得将被排序的数组中前五个专辑的专辑数据。这没用。
Arrays returning undefined for API calls (spotify app)
Beyonce的一张专辑的API网址示例:
https://api.spotify.com/v1/albums/2UJwKSBUz6rtW4QLK74kQu
所有Beyonce专辑列表的API网址:
https://api.spotify.com/v1/artists/6vWDO969PvNqNYHIOW5v0m/albums?album_type=album
答案 0 :(得分:1)
这是一个示例,显示获取艺术家的专辑列表,然后显示每张专辑的流行度值,最后对结果数组进行排序,因此最受欢迎的专辑是数组中的第一个。
$(document).ready(function () {
var albums = [], results = [];
// We start with calling the artist's api
$.ajax({
url: "https://api.spotify.com/v1/artists/6vWDO969PvNqNYHIOW5v0m/albums?album_type=album",
dataType: 'json',
success: function (data) {
// Extract the album name and href for the api call
albums = data.items.map(function (album) {
return {
name: album.name,
href: album.href
};
});
// Create an array of deferred calls
var deferreds = albums.map(function (album) {
var ajax = $.ajax({
url: album.href,
dataType: 'json',
success: function (data) {
// We only care about popularity and name
results.push({
popularity: data.popularity,
name: data.name
});
}
});
return ajax;
});
// Wait for the album calls to finish
$.when.apply($, deferreds).then(function() {
// Sort on popularity.
results.sort(function (a, b) {
if (a.popularity < b.popularity)
return 1;
else if (a.popularity > b.popularity)
return -1;
else
return 0;
});
// Results now contains a list of all albums, sorted on popularity
alert(results.length);
});
}
});
});