【问题标题】:Dynamic Associative Array Creation in Javascript from JSON从 JSON 使用 Javascript 创建动态关联数组
【发布时间】:2010-09-19 00:24:40
【问题描述】:

这听起来比实际上要复杂得多。

所以在 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 数据”

【问题讨论】:

    标签: javascript jquery json


    【解决方案1】:

    我认为您可以将 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 动态写入文本字段并确保其格式正确。

    【讨论】:

    • 在你的最后一个代码块中,它应该是函数(名称,结果)。 name 是键,结果是该键的值。
    • 我接受了第一部分,因为事实证明我可以直接访问 json 对象。愚蠢的我一开始就没有意识到这一点。
    • 好吧,在 MooTools 中它是相反的,所以我习惯了那个模型。
    • +1 告诉我data['results']['dataset_a']['dataset_two']['data']; 调用 json 对象的方式。
    • 方括号是可用于数组arr = [1]; arr[0]和对象obj = { foo : 'hello world'}; obj['foo']; x = 'foo'; obj[x]的访问器
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这行得通。只需将其转储到脚本块中即可进行测试。

          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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-25
        • 2014-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多