2012-10-23 3 views
3

구문 분석하고 합계를 추가 한 다음 새 데이터로 배열을 추출하려는 REST 호출에서 일부 JSON 데이터가 반환되었습니다. 파싱, 루핑 및 추가 작업을 수행 한 결과 페이지 (게시 : json sibling data 참조)에 결과를 쓸 수 있지만 총계를 더 자세히 분석하고 싶습니다.반환 된 JSON의 새로운 자바 스크립트 배열

 
{"ResultSet":{ 

    "Result":[ 

    { 
     "file_size":"722694", 
     "desc":"description1", 
     "format":"GIF" 
    }, 

    { 
     "file_size":"19754932", 
     "desc":"description1", 
     "format":"JPEG" 
    }, 

    { 
     "file_size":"778174", 
     "desc":"description2", 
     "format":"GIF" 
    }, 

    { 
     "file_size":"244569996", 
     "desc":"description1", 
     "format":"PNG" 
    }, 

    { 
     "file_size":"466918", 
     "desc":"description2", 
     "format":"TIFF" 
    } 

    ] 

}} 

내가 각기 다른 "내림차순"에 대한 합계를 반환 그것을 가지고 (답변 참조 : https://stackoverflow.com/a/13016615/1766026)를 여기로 시작 해요 JSON은,하지만 지금은 한 걸음 더 나아가 그것을 파괴 할 각 "형식"을 각각 "내림차순"에 대한 쇼 합계 새로운 출력은 같을 것이다 있도록 :

설명 1 : 4백44메가바이트 (222메가바이트의 TIFF, 111메가바이트의 GIF, 111메가바이트 JPEG)

설명 2 : 333메가바이트 (111메가바이트 PNG, 111MB TIFF, 111MB JPEG)

모든 반환 된 항목이 같은 종류의 파일 형식을 가지고있는 것은 아닙니다.

(예, 나는이 번호는 JSON로부터 추가하지 마십시오 알 - 그것은 그냥 예)

나는이 기반으로하는 새로운 배열 (들)에 결과를 눌러 수행 할 수 있습니다 생각하고 있어요 일치하는 요소에 대해 반복하고 페이지에 침을 뱉어 라.

어쩌면 새로운 어레이/객체가 다음과 같이 보일 수 있습니까? 난 그냥이 본

 
{ 
    "desc":"description1", 
    "TIFF":"222", 
    "GIF:"111", 
    "JPEG:"111" 
}, 
{ 
    "desc":"description2", 
    "PNG":"111", 
    "TIFF:"111", 
    "JPEG":"111" 
} 

: How do I create JavaScript array (JSON format) dynamically? 나는 그 한 장소 시작하는 것 같아요?

(가능한 부적절한 용어를 용서하십시오 - 나는 주로 프런트 엔드 작업과 이런 종류의 물건은 나에게 아주 새로운을 - 정중 건설적인 비판은 기꺼이 받아)

+0

예를 들어 비교적 사소한 일이지만, 서버와 대조적으로 클라이언트에서 처리를 수행하는 경향이 있습니다. 좋은 이유가있을 수 있지만 서버가 집계 데이터를 반환하도록 할 수 있다면 장기적으로 고통을 덜어 줄 수 있습니다. 이것은 SQL이 설계 한 것과 다른 언어로 수행 될 수있는 반면, 융통성있게 사용하려면 모든 집계 시나리오에 대한 대규모의 복잡한 라이브러리로 끝나는 경우가 많습니다. – Basic

+0

이것은 자체 REST API를 사용하여 이와 같은 정보를 가져 오는 웹 앱용입니다. 대부분의 페이지 표시는 javascript/AJAX/JSON을 사용합니다. 이 모든 정보는 REST를 통해 사용할 수 있으므로 가능한 경우이를 사용하고 싶습니다.이것이 너무 느려지는 경우 우리는 서버 측 코드로 약간의 HTML을 뱉어 낼 수 있습니다. 귀하의 의견을 보내 주셔서 감사합니다. – mflorida

+0

나는 완전히 이해하고 - 나 자신을 아주 많이한다. UI는'/ StatsBy/DocType','/ StatsBy/Author' 등을 요구하기도합니다. 바로 그 이유 때문입니다. 어쨌든, 오신 것을 환영합니다. – Basic

답변

1

예. 배열을 반복하고 배열을 객체로 만듭니다.

var arr = parsedObj.ResultSet.Result; 

var byDesc = {}; // an object as a key-value-map 
for (var i=0; i<arr.length; i++) { 
    var desc = arr[i].desc, 
     format = arr[i].format; 
    if (! (desc in byDesc)) 
     byDesc[desc] = {}; 
    if (! (format in byDesc[desc])) 
     byDesc[desc][format] = 0; 
    byDesc[desc][format] += (+arr[i].file_size); // parseInt 
} 

지금 우리는 형식과 설명으로 filesizes와 객체를 가지고 :

{"description1":{"GIF":722694,"JPEG":19754932,"PNG":244569996},"description2":{"GIF":778174,"TIFF":466918}} 

가 원하는 출력을 얻기 위해, 우리는 단지이 객체 열거 :

var output = []; 
for (var desc in byDesc) { 
    var total = 0, 
     formats = []; 
    for (var format in byDesc[desc]) { 
     formats.push(Math.round(byDesc[desc][format]/1000)+"MB "+format); 
     total += byDesc[desc][format]; 
    } 
    output.push(desc+": "+Math.round(total/1000)+"MB ("+formats.join(", ")+")"); 
} 
return output.join("\n"); 

을 우리는 얻을

description1: 265048MB (723MB GIF, 19755MB JPEG, 244570MB PNG) 
description2: 1245MB (778MB GIF, 467MB TIFF) 
+0

나는 코드 작업의 첫 덩어리를 얻었다. 처음에는 그대로두고, 기존의 jQuery $에서 작업하도록 수정했습니다. 각 루프는 다른 작업을하고 있습니다. 'console.debug (byDesc);를 실행하는 것이 좋습니다. 하지만 출력 (** "description1"** 등)에 대한 최상위 레벨에 액세스하려면 어떻게해야합니까? 내가 보여준 것처럼 출력을 얻을 수 없습니다. 그것은 그대로이고, 출력을 렌더링하기 위해'return'을 사용하는 방법을 모르겠습니다 (원시 자바 스크립트 newbie-isms를 용서합니다. 대부분 jQuery로 프론트 엔드 작업을합니다). 가능한 경우 jQuery의'.append()'함수로 렌더링하고 싶습니다. 감사! – mflorida

+0

다음 코드는'undefined : 3.738 GB (2.082 GB DICOM, 51.65 MB GIF, 1.605 GB NIFTI, 178 KB) ** '$ ('body ')의 출력입니다. output.join ("\ n"));'. 최상위 "desc"이름은 어떻게 접근 할 수 있습니까? – mflorida