2014-04-29 2 views
0

이 문제를 해결하는 데 어려움이 있습니다. 유사한 질문에 대한 몇 가지 답변을 검색해 보았지만 모든 예제의 JSON 데이터가 너무 간단했습니다. 내 것은 더 복잡합니다.일치하는 키 값에 대한 복합 JSON 데이터 검색

나는 반복하고있는 숫자의 배열을 가지고있다. 각 루프마다 일치하는 항목을 찾은 다음 해당 항목에서 특정 키 값을 가져 오기 위해 JSON 데이터와 번호를 일치시켜야합니다.

results = [377, 375, 373, 353, 355]

이 내 JSON 데이터의 예는 다음과 같습니다 :

내 배열의 예입니다 results에서 각 번호에 대한

{ 
    "count": 10, 
    "posts": [ 
     { 
      "title": "Title of Post", 
      "attachments": [ 
       { 
        "id": 377, 
        "images": { 
         "full": { 
          "url": "http://example.com/images/foo.jpg", 
          "width": 800, 
          "height": 600 
         }, 
         "thumbnail": { 
          "url": "http://example.com/images/foo_thumb.jpg", 
          "width": 150, 
          "height": 150 
         } 
        } 
       }, 
       { 
        "id": 355, 
        "images": { 
         "full": { 
          "url": "http://example.com/images/bar.jpg", 
          "width": 800, 
          "height": 600 
         }, 
         "thumbnail": { 
          "url": "http://example.com/images/bar_thumb.jpg", 
          "width": 150, 
          "height": 150 
         } 
        } 
       } 
      ] 
     }, 
     // 9 more posts... 
    ] 
} 

, 나는 각각에 대해 그것을 일치 할 필요 posts.attachments.id. 따라서이 경우 377355은 일치합니다. 일치하는 모든 첨부 파일의 경우 fullthumbnail 개의 URL을 가져와야합니다.

내가 말했듯이, 이것에 대한 가능한 해결책을 찾았지 만 예제 데이터는 1-2 레벨 정도의 깊이입니다. 나는이 특별한 시나리오에 필요한 루프 주변에서 머리를 감쌀 수 없다.

+0

질문에 대한 답변이있는 경우 대답 중 하나를 수락하고 답변하지 않은 질문을 던지게하십시오. 또한 질문에 대답하는 사람들에게 보람을 줄 수있는 사람이 없으면 그렇게 할 동기가 줄어들 것입니다. – furier

+0

계속 켜져 있습니다. 식사, 수면 및 기타 비 코딩 활동과 같은 일을하기 위해 최소한 24 시간을 사람들에게 제공하십시오. ;-) –

답변

0
var urls = []; 
results.forEach(function(result){ 
    posts.forEach(function(post){ 
     post.attachments.every(function(attachment){ 
      if(result === attachment.id) { 
       urls.push({ 
        id: attachment.id, 
        full: attachment.images.full.url, 
        thumbnail: attachment.images.thumbnail.url 
       }); 
       return false; 
      } 
      return true; 
     }); 
    }); 
}); 

중첩 된 foreach는 많은 당신은 항상 최소한 로 유지해야하는, 여기에 루프하지만 모든 데이터가 얼마나 큰 귀결와 미래에있을 것입니다.

forEach은 기본 javascript 함수이며 imo는이를 반복적으로 읽기 쉽도록 만들어줍니다. every 메서드를 사용하면 false를 반환하여 루프를 중단 할 수 있으므로 배열의 마지막 요소와 일치하지 않는 한 전체 목록을 탐색 할 필요가 없습니다.

+0

이것은 완벽하게 작동했습니다! 필자는 EC5 방법을 사용하기를 좋아합니다. 읽기 쉽고 프로젝트의 브라우저 지원과 인라인됩니다. 감사! –

1
var urls = []; 
var att = posts.attachments; 
for (var i = 0; i < results.length; i++) { 
    var id = results[i]; 
    for (var j = 0; j < att.length; j++) { 
     if (att[j].id == id) { 
      urls.push({ 
       id: id, 
       full: att[j].images.full.url, 
       thumbnail: att[j].images.thumbnail.url 
      }); 
      break; 
     } 
    } 
} 
+0

나보다 빨리 찢어> : +1 – tymeJV

+0

당신은 너무 빨리 upvoted, 그것은 심지어 제출하기 전에 것처럼 보였다. :) – Barmar