2012-05-12 5 views
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]))와 테스트 어레이 내의 배열에 값을 저장하지 않는 것 (즉, 단지 공백 경고).

편집 : (아래) 올렉 V. 볼코프에 의해 발견 실수 후 :

$.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])); 

}); 

가 여전히 작동하지.

+0

JSON 형식이 잘못된 것 같습니다. –

+0

@TheSystemRestart 이것이 파이썬 사전이라고 생각합니다. – VisioN

+0

@VisionN - 맞아. JSON 형식을 표시하도록 지금 수정했습니다. –

답변

1
var cat = data[key]; 

이 줄은 필요하지 않습니다. 귀하의 데이터는 이미 value입니다.

각 반복마다 동일한 test[l] 값을 덮어 쓰고 있으므로 결국 가장 바깥 쪽 반복의 결과 만 나타납니다. 많은 브라우저에서 "5": ["Regulation", 0, {}] 키/값 쌍을 넘는 브라우저가됩니다. 코드를 살펴보고 cat[2]{}이 될 것이므로 마지막 반복은 빈 개체가있는 test[]의 내용을 덮어 씁니다. 따라서 keys은 빈 목록을 올바르게 반환하지만 논리에 오류가 있습니다. 업데이트 된 예에 대해서는

: 당신이 그것을 확인하는 .inArray을 사용하기 때문에 는 여전히 {}으로 시험 항목을 덮어하고 있으며 항상 배열의 숫자 값을 찾지 못하는 경우에 성공합니다. .inArray은 키/색인이 아닌 특정 값을 찾습니다. 특정 인덱스가 비어 있는지 확인하고 if(!test[l])

+0

나는 당신이 관찰 한 실수를 고려하여 코드 (위 그림)를 편집했다. 그래도 작동이 안되는. –

+0

데이터로 정확히 무엇을하고 싶습니까? 귀하의 코드 의도가 명확하지 않습니다. –

+0

데이터는 트리 구조와 같은 계층 구조입니다. 계층의 모든 레벨에서 각 멤버에 대한 정보를 하나의 연관 배열로 저장하려고합니다. 각 회원마다 고유 한 ID가 있습니다. 결국, 나는'array [level] [member_id]'를 통해 각 청크에 접근 할 수 있기를 원한다. 위의 코드는 내가하고 싶은 것을 정확하게하지 않습니다. 내가 겪고있는 문제를 재현하기 위해 간단하게 단순화되었습니다. –

관련 문제