【问题标题】:Printing individual objects to a DOM when their IDs vary当 ID 不同时将单个对象打印到 DOM
【发布时间】:2015-12-31 16:50:48
【问题描述】:

我正在开发一个 JavaScript 网络应用程序,该应用程序接受用户的输入(音乐艺术家的姓名)并输出相关艺术家的列表以及他们最受欢迎的歌曲,由 Spotify API 确定。我最初有这个功能的基本版本,但它只会发布所有相关艺术家的列表,并在其上方列出这些相关艺术家最受欢迎的歌曲,我希望打印出整个对象(艺术家加上大多数流行歌曲)。

我有一系列代表艺术家的对象,这些对象是我通过带有 Node.js 和 Browserify 的 spotify-web-api-js 节点模块收到的,以使其在浏览器上运行,由他们的 Spotify ID 唯一标识。如果在用户进行搜索之前我事先不知道这些 ID,我该如何循环它们,以便我可以正确地将它们推送到一个对象中,然后我可以通过 jQuery 的append 将它们输入到 DOM?我一直在尝试以各种方式访问​​它们,但它似乎不起作用:

s.getArtistRelatedArtists(originalArtistId, function(err, data) {

  for (i = 0; i < data.artists.length; i++)
  {
      console.log(data.artists[i].name);
      relatedArtistsObject[data.artists[i].id] = {
        name: data.artists[i].name,
        songs: []
      };
      s.getArtistTopTracks(data.artists[i].id, "US", function (err, data2) {
          if (relatedArtistsObject[data2.tracks[0].artists[0].id] !== undefined)
          {
          // console.log(data2.tracks[0].name); -- this outputs the song titles I want
            relatedArtistsObject[data2.tracks[0].artists[0].id].songs.push(data2.tracks[0].name);

          }
      });
  }
 console.log(relatedArtistsObject);
 // loop through this object and print it through the screen
 for (k = 0; k < relatedArtistsObject.length; k++)
 {

   console.log(relatedArtistsObject.id.songs[0].name);
   $('#related-artist').append(relatedArtistsObject[k]);

 }
  //  $('#related-artist').append(relatedArtistsObject);
 });

这里是完整代码的链接(因为没有启用 Node.js/browserify 而无法运行):https://jsfiddle.net/pmh04e99/

This answer 部分有用,但不适用于此处,因为 JSON 输出在我要访问的数组中没有“名称”字段。相反,songs 是一个 1 的数组,我想要的内容在项目 0 内。我的relatedArtistsObject 的console.log 输出如下所示,例如:

当我现在不知道 spotify ID 时,如何通过我的代码访问 DOM 中的这些对象?

注意:我知道我还没有进行错误处理,但我希望能够先实现主要功能。

【问题讨论】:

    标签: javascript jquery json node.js spotify


    【解决方案1】:

    您可以使用for inObject.keys

    前者将遍历对象的每个可枚举属性名称,并将该名称设置为指定的变量。然后,您可以使用该名称访问该对象的属性值。

    后者将返回对象属性名称的数组。然后,您可以使用常规 for 循环遍历该数组并将数组中的每个值用作 id

    对于...在

    for(id in relatedArtistsObject){
      var artist = relatedArtistsObject[id];
      console.log(artist.name,artist.songs);
    }
    

    对象.keys

    var ids = Object.keys(relatedArtistsObject);
    for(var i=0; i<ids.length; i++){
      var artist = relatedArtistsObject[ids[i]];
      console.log(artist.name,artist.songs);   
    }
    

    【讨论】:

    • Object.keys 和 For...In 都给了我艺术家姓名和一个空数组 [ ]。由于songs 数组中有一项,我尝试了artist.songs[0],这给了我undefined。我会继续研究它,但你对这个问题有什么建议吗?谢谢!
    • 原来是async.times 问题;在对相关艺术家的最后一个 JSON 请求完成之前,它正在调用艺术家的顶级歌曲,这就是它未定义的原因。我会接受你的回答,因为你解决了我提出的实际问题,这对让我走上正确的道路很有帮助。
    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多