为什么$ .getJSON仅在使用字符串文字时起作用,而在使用变量时引发未定义的错误?

时间:2019-06-02 16:40:58

标签: javascript

所以我认为这可能是一个范围问题,但是对于为什么我无法使用变量访问$ .getJSON()请求的响应数据有些困惑。

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

但是,在评估数据响应时,即使cat = fruits(这是fruits.json文件中对象的名称),使用“ data.cat.length”的结果仍未定义。

硬编码'data.fruits.length'可以按预期工作,但是将'fruits'替换为变量'cat'则返回未定义。

不确定我在做什么错,但是目标是让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'相同,但是似乎数据对象不同意。对我在做什么错有任何想法吗?

1 个答案:

答案 0 :(得分:0)

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

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

换一种说法,如果您的JSON响应看起来像这样,data.cat.length会起作用:

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

相反,data.fruits.length可能有效,因为我猜您的响应是这样的对象:

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

但是,如果您的响应是最后一个对象,而您要求data.cat.length,则data.cat很可能会返回undefined

如果您有一个这样的响应对象,但是想通过一个类别变量访问它的"fruits"部分,则需要访问this answer中给出的对象属性。因此,就您而言:

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响应不像我在上面猜测的那样,我可能已经回答了一个完全不相关的问题:)