0

配列内に配列を構築しようとしていますが、配列 [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]));

});

まだ動作していません。

4

1 に答える 1

1
var cat = data[key];

この行は必要ありません。あなたのデータはすでににありvalueます。

各反復で同じ値を上書きtest[l]しているため、最終的には、最後の最も外側の反復の結果のみが表示されます。多くのブラウザーでは、"5": ["Regulation", 0, {}]キーと値のペアを超えるものになります。コードをざっと見てみると、それcat[2]が適切であり、最後の反復で空のオブジェクト{}が上書きされます。test[]したがって、keys空のリストは正しく返されますが、ロジックにエラーがあります。

{}更新された例について:テストエントリをチェックするために使用しているため、まだテストエントリを上書きし.inArrayており、配列内の数値が見つからないことが常にあります。.inArrayキー/インデックスではなく、特定の値を検索します。代わりに、特定のインデックスが空かどうかを確認する必要がありますif(!test[l])

于 2012-05-12T11:11:27.543 に答える