如何在Javascript中动态正确填充关联数组

时间:2012-05-12 09:44:35

标签: javascript jquery

我正在尝试在数组中构建数组,我希望能够通过array [x] [y]访问存储的数据。我有一个示例代码,我无法以我想要的方式工作,我想知道是否有人能发现问题。

$.getJSON("/data/", function(data){

    var test = {};
    var levels = [1,2,3];

    $.each(data, function(key, value){

        var cat = data[key];

        $.each(levels, function(li,l){

            var base = cat[2];
            var keys = Object.keys(base);

            if (l == 1) {

                test[l] = {};

                $.each(keys, function(ki,k){
                    test[l][k] = base[k][0];
                });
            }

        });

    });

    alert(Object.keys(test[1]));

});

获取的JSON数据的结构如下所示:

{
    "1": ["Distribution", 0,
    {
        "9": ["Salmonella", 0,
        {}],
        "6": ["E. coli", 0,
        {
            "8": ["from pigs", 0,
            {}],
            "7": ["from humans", 0,
            {}]}]}],
    "2": ["Adhesin", 0,
    {
        "1": ["PapG", 1,
        {
            "2": ["has three subtypes:", 0,
            {
                "3": ["PapG-I", 0,
                {}],
                "4": ["PapG-II", 0,
                {}],
                "5": ["PapG-III", 0,
                {}]}]}]}],
    "3": ["Receptors", 0,
    {}],
    "4": ["Disease associations", 0,
    {}],
    "5": ["Regulation", 0,
    {}]
}​

上面的代码似乎没有将值存储到测试数组中的数组,因为alert(Object.keys(test[1]))没有提供任何内容(即只是空白警报)。

在Oleg V. Volkov(下图)发现错误后

编辑

$.getJSON("/data/", function(data){

        var test = {};
        var levels = [1,2,3];

        $.each(data, function(key, value){

               // var cat = data[key];

               $.each(levels, function(li,l){

                     var base = value[2];
                     var keys = Object.keys(base);

                     if (l == 1) {

                          if ($.inArray(l,test) == -1){ 
                              test[l] = {};
                          }

                          $.each(keys, function(ki,k){
                             test[l][k] = base[k][0];
                          });
                      }

               });

        });

        alert(Object.keys(test[1]));

});

仍然无法正常工作。

1 个答案:

答案 0 :(得分:1)

var cat = data[key];

你不需要这条线。您的数据已在value

你在每次迭代时都会覆盖相同的test[l]值,所以最后你只会得到最后一次最外面迭代的结果 - 在许多浏览器中,这将超过"5": ["Regulation", 0, {}]键/值对。快速查看代码建议cat[2]将为{},因此最后一次迭代将使用空对象覆盖test[]中的任何内容。因此,您的keys正确返回空列表,但您的逻辑中存在错误。

关于您更新的示例: 您仍然使用{}覆盖测试条目,因为您使用.inArray进行检查,并且它总是会成功找不到数组中的任何数字值。 .inArray查找特定值,而不是键/索引。您应该使用if(!test[l])

检查特定索引是否为空