为什么$ .getJSON仅在使用字符串文字时有效,并在使用变量时抛出未定义的错误?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (9)

所以我认为这可能是一个范围问题,但我有点难以理解为什么我无法使用变量从$ .getJSON()请求访问响应数据。

当调用$ .getJSON('fruits.json')时,数据按预期返回,我可以将'fruits.json'替换为cat +'。json',这似乎也可以正常工作。

但是,在评估数据响应时,使用'data.cat.length'返回undefined,即使cat = fruits是fruits.json文件中对象的名称。

硬编码'data.fruits.length'按预期工作,但为变量'cat'交换'fruits'会返回undefined。

不确定我做错了什么,但目标是让createQuestion(category)函数根据类别输入动态加载不同的JSON文件。

    function createQuestion(category){

          var cat = category;

          // JSON Data Import
          $.getJSON('fruits.json', function(data) {

            // Generate Cards
            var cards = [];
            var display = [];
            for (i=0; i<data.fruits.length; i++) {
              cards.push(data.fruits[i]);
            }

我假设var cat ='fruits'与'fruits'相同,但似乎数据对象不同意。对我做错了什么的想法?

提问于
用户回答回答于

响应数据对象是如何布局的; 即你可以data在响应回调中实际发布变量的结构吗?

在没有看到数据的情况下,我最初的猜测是,当你说data.cat.length,你试图获得字面上被称为data对象的属性。不是名称是作为参数传递给函数的类别的属性,而只是。'cat''cat'

换句话说,data.cat.length如果您的JSON响应看起来像这样:

{ 
  "cat": ["tabby", "siamese", "persian"]
  ...
}

相反,data.fruits.length可能正在工作,因为我猜你的回答是这样的对象:

{
  "fruits": ["apple", "orange", "banana"]
  ...
}

但是如果你的回答是最后一个这样的对象,并且你要求的话data.cat.lengthdata.cat很可能会回来undefined

如果您有这样的响应对象,但想要"fruits"通过类别变量访问它的一部分,则需要访问此答案中给出的对象属性。所以,在你的情况下:

var cat = "fruits"
data[cat].length // should be 3, with our example response above

所以也许你需要修改你的功能:

function createQuestion(category){
  var cat = category;

  // JSON Data Import
  $.getJSON(cat + '.json', function(data) {
    // Generate Cards
    var cards = [];
    var display = [];

    for (i=0; i < data[cat].length; i++) {
      cards.push(data[cat][i]);
    }

也就是说,如果您的JSON响应不是我上面猜到的,我可能已经回答了一个完全不相关的问题:)

扫码关注云+社区

领取腾讯云代金券