如何对从API返回的json进行排序?

时间:2016-03-02 07:35:58

标签: javascript json api spotify

此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

1 个答案:

答案 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);
                });
            }
        });
    });