JSON中Javascript中的动态关联数组创建

时间:2008-10-24 13:54:33

标签: javascript jquery json

听起来比实际情况复杂得多。

所以在Perl中,你可以这样做:

foreach my $var (@vars) {
  $hash_table{$var->{'id'}} = $var->{'data'};
} 

我有一个JSON对象,我想做同样的事情,但在jQuery中有一个javascript关联数组。

我尝试了以下内容:

hash_table = new Array();

$.each(data.results), function(name, result) {
  hash_table[result.(name).extra_info.a] = result.(name).some_dataset;
});

其中data是从$ .getJSON调用获取的JSON对象。它看起来或多或少是这样的(我的JSON语法可能有点不对,抱歉):

{
  results:{
    datasets_a:{
      dataset_one:{
        data:{
          //stuff
        }
        extra_info:{
          //stuff
        }
      }
      dataset_two:{
         ...
      }
      ...
    }
    datasets_b:{
      ...
    }
  }
}

但每次我这样做时,firebug都会抛出以下错误:

“XML过滤器应用于非xml数据”

3 个答案:

答案 0 :(得分:3)

我认为您可以将JSON响应用作关联数组。所以你应该可以直接进入并使用JSON。

假设您收到了上述示例:

$('result').innerHTML = data['results']['dataset_a']['dataset_two']['data'];
// Or the shorter form:
$('result').innerHTML = data.results.dataset_a.dataset_two.data;

明白我没有测试过这个,但是使用带有变量的方括号比使用括号加上带有点访问器的名称更安全。

你的例子失败了,因为我抓住了一些错综复杂的逻辑。

$.each(data.results), function(name, result) {
     hash_table[result.(name).extra_info.a] = result.(name).some_dataset;
});

现在,foreach循环遍历变量data.results以查找深度为1的内部元素。它找到的项目将使用项目的键赋予lambda。 AKA,第一个结果将是name = "datasets_a" item = object。到目前为止跟着我?现在,您访问返回的哈希,即item中的对象,就好像它在name ...“datasets_a”中有子键一样。但是等等,这个对象!

如果所有其他方法都失败了......将结果JSON动态写入文本字段并确保其格式正确。

答案 1 :(得分:0)

为什么要将数组更改为另一个数组? - )

- 为什么不简单地访问数据,如果你想简化或过滤,你可以直接遍历对象的数组! - )

答案 2 :(得分:0)

这很有效。只需将其转储到脚本块中即可进行测试。

    d = {
      'results':{
       'datasets_a':{
          'dataset_one':{
            'data':{
              'sample':'hello'
            },
            'extra_info':{
              //stuff
            }
          },
      'dataset_two':{
            ///
          }
          ///
    },
        'datasets_b':{
         ///
        }
      }
}
alert(d.results.datasets_a.dataset_one.data.sample)

我希望这是正确粘贴的。这个编辑器不喜欢我在代码中的换行符。

d = {
  'results':{
   'datasets_a':{
      'dataset_one':{
        'data':{
          'sample':'hello'
        },
        'extra_info':{
          //stuff
        }
      },
      'dataset_two':{
        ///
      }
      ///
    },
    'datasets_b':{
     ///
    }
  }
};

alert(d.results.datasets_a.dataset_one.data.sample)