【问题标题】:Working with / and variables in object names (JSON) [duplicate]在对象名称 (JSON) 中使用 / 和变量 [重复]
【发布时间】:2017-05-18 17:56:19
【问题描述】:

我正在使用 JSON 来查询 themoviedb.org 提供的 API。

我想列出剧集。为此,我需要访问名为“season/1”、“season/2”、“season/3”等的几个对象的长度属性,但我总是遇到错误。

返回的 JSON 代码如下:

"season/1": {
    "_id": "5256c89f19c2956ff6046d47",
    "air_date": "2011-04-17",
    "episodes": [
        {
            "air_date": "2011-04-17",
            "crew": [],
            "episode_number": 1,
            "guest_stars": [],
            "name": "Der Winter naht",
            "overview": "Ein Deserteur der Nachtwache bringt erschreckende Nachrichten von den Ländern nördlich der Mauer, und Lord Eddard \"Ned\" Stark soll die Hand des Königs Robert Baratheon werden.",
            "id": 63056,
            "production_code": "101",
            "season_number": 1,
            "still_path": "/wrGWeW4WKxnaeA8sxJb2T9O6ryo.jpg",
            "vote_average": 7.493,
            "vote_count": 67
        },
        {...},
        .
        .
        .
    ]
}

我的 Javascript 代码:

var urlBase = 'https://api.themoviedb.org/3/tv/';
var tvId = 'XXX';
var apiKey = '?api_key=MYKEY';
var apiLang = '&language=de_DE';

var descElement = document.getElementById('description');
var titleElement = document.getElementById('title');
var posterElement = document.getElementById('poster');
var castElement = document.getElementById('cast');
var seasonsElement = document.getElementById('seasons');
var episodesElement = document.getElementById('episodes');
var votesElement = document.getElementById('votes');
var epGuideElement = document.getElementById('epGuide');

var showRequest = new XMLHttpRequest();
var showUrl = urlBase + tvId + apiKey + apiLang + '&append_to_response=credits';
showRequest.open('GET', showUrl);
showRequest.send();

showRequest.onload = function() {
    var data = JSON.parse(showRequest.responseText);  
    var title = data.name;
    var description = data.overview;
    var episodes = data.number_of_episodes;
    var seasons = data.number_of_seasons;
    var votes = data.vote_average;
    var cast = '';

    for (i = 0; i < data.credits.cast.length; i++) {
        cast += 
            '<div style="background-color:#dedede;text-align:center;width:145px;height:215px;margin:10px;padding:10px;display:inline-block;float:left;position:relative;"><img src="http://image.tmdb.org/t/p/w90/'
            + data.credits.cast[i].profile_path 
            + '" alt="' 
            + data.credits.cast[i].name 
            + '" style="margin-top:5px;"><br><div style="width:160px;bottom:20px;left:50%;transform:translate(-50%);position:absolute;"><span style="font-size:14px;">' 
            + data.credits.cast[i].character 
            + '</span><br><strong>' 
            + data.credits.cast[i].name 
            + '</strong></div></div>';
    }

    var epGuide = '';

    for (i = 1; i <= seasons; i++) {
        epGuide += '<h3>Staffel ' + i + '</h3>';

        for (ii = 1; ii < data['season/'+i].episodes.length; ii++) {
            epGuide += '<p>Folge ' + (ii + 1) + '</p>';
        }
    }

    titleElement.insertAdjacentHTML('beforeend', title);
    descElement.insertAdjacentHTML('beforeend', description);
    posterElement.src = 'http://image.tmdb.org/t/p/w92' + data.poster_path;
    castElement.insertAdjacentHTML('beforeend', cast);
    episodesElement.insertAdjacentHTML('beforeend', episodes);
    seasonsElement.insertAdjacentHTML('beforeend', seasons);
    votesElement.insertAdjacentHTML('beforeend', votes);
    epGuideElement.insertAdjacentHTML('beforeend', epGuide);

};

如何选择名称中带有斜线和变量的“season/i”对象?

//编辑:

你去吧,整个代码。希望我们能找到解决办法。

【问题讨论】:

  • 括号符号....
  • 什么是 var data?它是一个数组吗?对象?
  • 是API提供的JSON对象。

标签: javascript json api object dom


【解决方案1】:

在 javascript 中,每个变量都是一个 hashTable 数据结构,您可以访问/更改其项目,例如数组/hashTable:

var person = {name:'Siamand',family:'Maroufi'};

我们可以通过以下方式访问 person 对象的 name 属性:

var name= person.name;

或

var name =person['name']

所以在您的情况下,您可以将代码更改为以下代码:

var epGuide = '';

for (i = 1; i <= seasons; i++) {
    epGuide += '<h3>Staffel ' + i + '</h3>';

    for (ii = 1; ii < data['season/'+i].episodes.length; ii++) {
        epGuide += '<p>Folge ' + (ii + 1) + '</p>';
    }
}

示例 sn-p:

var response = `
  {
  "season/1": {
    "_id": "5256c89f19c2956ff6046d47",
   "episodes": [{
    "air_date": "2011-04-17"
    }]
    }
  }
`;

var data = JSON.parse(response);
var seasons = 2;
var epGuide ="";
for(var i=1;i<seasons;i++){
   epGuide += '<h3>Staffel ' + i + '</h3>';
   for (ii = 0; ii < data['season/'+i].episodes.length; ii++) {
       epGuide += '<p>Folge ' + (ii + 1) + '</p>';
   }
}

console.log(epGuide);

顺便说一句,你使用的 api 有你之前说的这样的结果,它有点像下面,它有一个简单的季节数组

【讨论】:

  • 不,它不起作用。控制台说:“movie.js:47 Uncaught TypeError: Cannot read property 'episodes' of undefined at XMLHttpRequest.showRequest.onload (movie.js:47)”
  • 因为您的数据变量没有 season/1 和 .. 属性,请使用 chrome 调试器查找数据值
  • 我编辑了问题以向您展示数据变量的来源。所以数据就是 JSON 对象。
  • 四季变量从何而来?
  • 我现在在我的问题中发布了整个代码。
猜你喜欢
  • 2013-06-01
  • 2010-12-06
  • 2016-12-02
  • 2011-08-13
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2012-06-20
  • 2011-03-10
相关资源
最近更新 更多