返回未定义的API调用数组(spotify app)

时间:2016-03-02 00:27:32

标签: javascript json api multidimensional-array spotify

嘿伙计们我正在开发一个使用Spotify API的Javascript网络应用程序。我正试图在表格中返回给定艺术家的前5张专辑。到目前为止,我已经让API调用工作了,他们返回一个表格,显示艺术家的所有专辑,没有特别的顺序。我正在尝试根据表中第五列的“受欢迎程度”将表缩小到前5张专辑。

 var popsort = new Array(new Array());
    var count = 0;

    $(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);
            console.log(json.items.length);
            for (var i = 0; i < json.items.length; i++) {
                createArray(json.items[i].href);
            }
            //console.log(count);
            popsort.sort(sortPopularity);
            //getAlbumInfo(json.items[i].href);
            getAlbumInfo(popsort);
        });
    }

    function getAlbumInfo(popsort) {
        var tr;
        console.log(popsort);
        // i<json.length
        // Sort the array first by popularity. And then create a for loop and print the first five. 
        tr = $('<tr/>');
        for (var i = 0; i < 5; i++) {
            tr.append("<td>" + popsort[i][0] + "</td>"); // Album Name
            tr.append("<td>" + popsort[i][1] + "</td>"); // Artist Name
            tr.append("<td>" + popsort[i][2] + "</td>"); // Release Date
            tr.append("<td>" + popsort[i][3] + "</td>"); // Number of Tracks
            tr.append("<td>" + popsort[i][4] + "</td>"); // Popularity
        }
        $('table').append(tr);

    }

    function createArray(albumhref) {
        //console.log(albumhref);
        $.getJSON(albumhref,
            function (json) {
                // i<json.length
                // Sort the array first by popularity. And then create a for loop and print the first five. 
                console.log(count);
                popsort[count][0].push(json.name);
                popsort[count][1].push(json.artists[0].name);
                popsort[count][2].push(json.release_date);
                popsort[count][3].push(json.tracks.total);
                popsort[count][4].push(json.popularity);
                ++count;
                //alert("table compiled");
                //alert("Table done");
            });
    }

    function sortPopularity(a, b) {
        if (a[4] === b[4]) {
            return 0;
        }
        else {
            return (a[4] < b[4]) ? -1 : 1;
        }
    }

});

我使用顶部的点击功能从textbox获取艺术家名称,并将其传递到返回search的“artistid”函数中。我将此artistid传递给“getSeveralAlbums”函数。此函数中的json调用将hrefs返回给特定艺术家的所有专辑,我希望将其与流行度一起存储在2D数组中。靠近底部的我的“sortPopularity”函数理想情况下会按照“受欢迎程度”的第五个元素对此数组进行排序,然后我计划将此排序数组(popsort)传递给getAlbumInfo函数它具有5次for循环打印,理想情况下将打印popsort数组的前五个元素。排序后,这将是艺术家最受欢迎的前5张专辑。

当我尝试运行此程序时,它会为popsort[count][0].push(json.name);函数中的createArray返回未定义的错误,并在tr.append("<td>" + popsort[i][0] + "</td>");中返回getAlbumInfo未定义的错误功能。我做错了什么?

更新:(新代码)

var popsort = new Array(new Array());
var count = 0;
var looopCount = 0;

$(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) {
        getSeveralAlbums(data.artists.items[0].id);
    });
}

function getSeveralAlbums(artistid) {
    $.getJSON("https://api.spotify.com/v1/artists/" + artistid + "/albums?album_type=album",
    function (json) {
        console.log(json.items.length);
        looopCount = json.items.length;
        for (var i = 0; i < json.items.length; i++) {
            createArray(json.items[i].href);
        }
    });
}

function getAlbumInfo(popsort) {
    var tr;
    // Sort the array first by popularity. And then create a for loop and print the first five. 
    tr = $('<tr/>');
    for (var i = 0; i < 5; i++) {
        tr.append("<td>" + popsort[i][0] + "</td>"); // Album Name
        tr.append("<td>" + popsort[i][1] + "</td>"); // Artist Name
        tr.append("<td>" + popsort[i][2] + "</td>"); // Release Date
        tr.append("<td>" + popsort[i][3] + "</td>"); // Number of Tracks
        tr.append("<td>" + popsort[i][4] + "</td>"); // Popularity
    }
    $('table').append(tr);

}

function createArray(albumhref) {
    $.getJSON(albumhref,
        function (json) {
            if (popsort.length <= count) {
                popsort.push(new Array());
            }
            // Sort the array first by popularity. And then create a for loop and print the first five. 
            popsort[count].push(json.name);
            popsort[count].push(json.artists[0].name);
            popsort[count].push(json.release_date);
            popsort[count].push(json.tracks.total);
            popsort[count].push(json.popularity);
            ++count;
            batchSort(--looopCount);
        });
}

function sortPopularity(a, b) {
    if (a[4] === b[4]) {
        return 0;
    }
    else {
        return (a[4] > b[4]) ? -1 : 1;
    }
}

function batchSort(i) {
    if (i <= 0) {
        popsort.sort(sortPopularity);
        getAlbumInfo(popsort);
    }
}
});

1 个答案:

答案 0 :(得分:1)

首先,您要访问.push()getAlbumInfo(sortPopularity);的未定义密钥,而是使用$.getJSON(albumhref, fn...);。其次,popsort函数已被调用,而第一个createArray响应尚未返回,因此您需要一个空数组才能访问。这就是访问$.getJSON()

时获得未定义返回的原因

我要做的是创建一个降序计数器并将其添加到var popsort = new Array(new Array()); var count = 0; var looopCount = 0; function getSeveralAlbums(artistid) { $.getJSON("https://api.spotify.com/v1/artists/" + artistid + "/albums?album_type=album", function (json) { console.log(json.items.length); looopCount = json.items.length for (var i = 0; i < json.items.length; i++) { createArray(json.items[i].href); } // call both popsort.sort(sortPopularity); and getAlbumInfo(popsort); after all the data is loaded to popsort, not here. }); } function createArray(albumhref) { $.getJSON(albumhref, function (json) { if (popsort.length <= count) { // if the length of popsort is less than count, it means that that index(count) is not yet present in popsort // push to add an item with index=count to popsort popsort.push(new Array()); } popsort[count].push(json.name); popsort[count].push(json.artists[0].name); popsort[count].push(json.release_date); popsort[count].push(json.tracks.total); popsort[count].push(json.popularity); ++count; batchSort(--looopCount); }); } function batchSort(i) { if (i <= 0) { popsort.sort(sortPopularity); getAlbumInfo(popsort); } } }); function getAlbumInfo(popsort) { for (var i = 0; i < 5; i++) { tr.append("<tr><td>" + popsort[i][0] + "</td>"); // Album Name tr.append("<td>" + popsort[i][1] + "</td>"); // Artist Name tr.append("<td>" + popsort[i][2] + "</td>"); // Release Date tr.append("<td>" + popsort[i][3] + "</td>"); // Number of Tracks tr.append("<td>" + popsort[i][4] + "</td></tr>"); // Popularity } } 的{​​{1}}回调中,如下所示:

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
但是,Haven没有对它进行过测试,但这就是想法..希望它有所帮助。