我搞亂了last.fm API。我拉着user's top artists data,它返回一個像這樣的JSON:d3.js:嵌套數據 - 鍵返回undefined的所有數據
{ "artist": [
{
"name": "Kanye West",
"playcount": "282",
"mbid": "164f0d73-1234-4e2c-8743-d77bf2191051",
"url": "http:\/\/www.last.fm\/music\/Kanye+West",
"streamable": "0",
"@attr": {
"rank": "1"
}
},
{
"name": "Childish Gambino",
"playcount": "148",
"mbid": "7fb57fba-a6ef-44c2-abab-2fa3bdee607e",
"url": "http:\/\/www.last.fm\/music\/Childish+Gambino",
"streamable": "0",
"@attr": {
"rank": "2"
}
},
等。經過一番小提琴之後,我爲第二個JSON(例如搖滾,流行音樂,嘻哈)拉動了第二個JSON,循環播放每位藝術家,並將他們最受歡迎的標籤推送到原始數據集。所以,現在我的JSON的樣子:
{ "artist": [
{
"name": "Kanye West",
"playcount": "282",
"mbid": "164f0d73-1234-4e2c-8743-d77bf2191051",
"url": "http:\/\/www.last.fm\/music\/Kanye+West",
"streamable": "0",
"@attr": {
"rank": "1"
},
"tag": "hip hop",
},
{
"name": "Childish Gambino",
"playcount": "148",
"mbid": "7fb57fba-a6ef-44c2-abab-2fa3bdee607e",
"url": "http:\/\/www.last.fm\/music\/Childish+Gambino",
"streamable": "0",
"@attr": {
"rank": "2"
},
"tag": "hip hop",
},
我想要做的下一件事是使用d3.nest
使用每個標籤(流派)爲重點,以捲起我的數據。我正在關注這個tutorial。我的最終目標是製作一個sunburst,與內圈的流派(例如,你聽多少嘻哈,獨立歌曲,流行音樂?)和 - 也許點擊 - 每個藝術家你聽多少(例如Kanye West對幼稚甘比諾)。
的主要問題是在這裏:
var dataset = d3.nest()
.key(function(d) {
return d.tag;
})
.entries(topArtists);
的key
將返回undefined
所有數據點。當我嘗試其他可能的密鑰(d.name
,d.streamable
)時,它們工作正常。我的數據按需要捲起來。所以這與tag
有關 - 這是我推送到topArtists
數據集的對象。我不確定發生了什麼事。下面是我通過循環如何,並結合標籤信息,藝術家信息:
//Merge
topArtists.forEach(function(d) {
//loop through each of the top 10 artists selected
//pull their mbid (musicbrainz id) and plug it into the var for tags
tags = 'http://ws.audioscrobbler.com/2.0/?method=artist.gettoptags&mbid='+ d.mbid + '&api_key=[my api key]&format=json';
//pull that JSON
d3.json(tags, function(error, tag) {
if (error) { return console.log(error); };
//capture only the most commonly used tag (artistTag)
//and also clean it up a bit
artistTag = tag.toptags.tag[0].name.toLowerCase().split('-').join(' ');
//push that string value to the original JSON
d["tag"] = artistTag;
}); // close tags JSON call
}); //close topArtists loop
關閉這些循環後,如果我console.log(topArtists)
,這一切看起來很好 - 標籤已被添加。 JSFiddle here。
問題是'd3.json'是異步的。它在'forEach'循環結束後運行。你可能想考慮一下[queue.js](https://github.com/mbostock/queue)。 – 2014-11-08 11:27:26
謝謝,拉爾斯。我認爲它可能是異步的 - 但是當我運行'forEach'循環和第二個JSON調用的'console.log(topArtists)* *外部時,它看起來很好 - 所有的'tags'都被追加。如果在下一行中,我嘗試'd3.nest' - 它們會變成未定義的。事實上,即使我做了'd3.nest().key(function(d){console.log(topArtists);})',標籤也顯示出來了。由於某種原因,它們只是沒有被捲起來。 – 2014-11-08 12:58:52
所以'console.log()'打印一個對象不完全正確嗎?在中,你點擊它來展開屬性等。點擊的時間實際上是在評估時。也就是說,當你打印表達式時,它不在那裏,但是當你點擊它時,就是這樣。在將數據放入數據之前和之後,您可以通過兩次打印相同的表達式來查看。當您檢查控制檯上的這些對象時,即使它們在打印時明顯不同,它們也是一樣的。 – 2014-11-08 13:09:58