2014-08-29 4 views
2

로다시를 처음 사용했습니다. 나는 이런 종류의 json 데이터를 가지고있다. 나는 이미 90-120 줄의 코드를 파싱하고, 계산을하고, 새로운 json을 만든다. 그것은 악몽이되고 있습니다.Lodash를 사용하여이 중첩 된 json 데이터를 변환하십시오.

나는이 json을 lodash의 방법을 사용하여 변환 할 수있는 방법에 대해 도움을 요청하고 싶습니다.

http://pastebin.com/BjBLwJDA

[ 
    { 
     "dates": [ 
      { 
       "datetime": "2014-08-26", 
       "deviceModels": [ 
        { 
         "deviceModel": "Canon450MX", 
         "devices": [ 
          { 
           "deviceModel": "Canon450MX", 
           "inchesPrinted": 10, 
           "serialNum" : "111" 
          }, 
          { 
           "deviceModel": "Canon450MX", 
           "inchesPrinted": 10, 
           "serialNum" : "222" 
          }, 
          { 
           "deviceModel": "Canon450MX", 
           "inchesPrinted": 10, 
           "serialNum" : "333" 
          } 
         ] 
        }, 
        { 
         "deviceModel": "HPDeskjet", 
         "devices": [ 
          { 
           "deviceModel": "HPDeskjet", 
           "inchesPrinted": 20, 
           "serialNum" : "444" 
          }, 
          { 
           "deviceModel": "HPDeskjet", 
           "inchesPrinted": 20, 
           "serialNum" : "555" 
          } 
         ] 
        } 
       ] 
      }, 
      { 
       "datetime": "2014-08-27", 
       "deviceModels": [ 
        { 
         "deviceModel": "Canon450MX", 
         "devices": [ 
          { 
           "deviceModel": "Canon450MX", 
           "inchesPrinted": 5, 
           "serialNum" : "111" 
          }, 
          { 
           "deviceModel": "Canon450MX", 
           "inchesPrinted": 25, 
           "serialNum" : "222" 
          }, 
          { 
           "deviceModel": "Canon450MX", 
           "inchesPrinted": 15, 
           "serialNum" : "333" 
          } 
         ] 
        }, 
        { 
         "deviceModel": "HPDeskjet", 
         "devices": [ 
          { 
           "deviceModel": "HPDeskjet", 
           "inchesPrinted": 10, 
           "serialNum" : "444" 
          }, 
          { 
           "deviceModel": "gx420d", 
           "inchesPrinted": 20, 
           "serialNum" : "555" 
          } 
         ] 
        } 
       ] 
      } 
     ] 
    } 
] 

나는 이렇게 될 새로운 출력 JSON을 싶습니다

[ 
    { date : 2014-08-26, deviceModel : 'Canon450MX', totalInchesPrinted : 30 }, 
    { date : 2014-08-26, deviceModel : 'HPDeskJet', totalInchesPrinted : 40 }, 
    { date : 2014-08-27, deviceModel : 'Canon450MX', totalInchesPrinted : 45 }, 
    { date : 2014-08-27, deviceModel : 'HPDeskJet', totalInchesPrinted : 30 } 
] 

어떤 도움도 대단히 감사하겠습니다!

감사합니다.

답변

11

이 필요한 형태로 데이터를 변환해야합니다

var sumInchesPrinted = function(total, device){ 
     return total + device.inchesPrinted 
    } 

    var transformDeviceModels = function(dates){ 
     return _.map(dates.deviceModels, function(deviceModel){ 
      return { 
       date: dates.datetime, 
       deviceModel: deviceModel.deviceModel, 
       totalInchesPrinted: _.reduce(deviceModel.devices, sumInchesPrinted, 0) 
      } 
     }); 
    }; 

    var data = _.chain(list[0].dates) 
     .map(transformDeviceModels) 
     .flatten() 
     .value(); 
+0

나는 그것을 시도하고 WOW, 그것은했다! 그것은 내 자신의 네이티브 지저분한 루프, HAHAHA에 비해 매우 깨끗합니다! 정말 고맙습니다! Btw, 위쪽 화살표를 클릭하여 투표를 시도했습니다. 나는 명성이 15 점 필요하다는 말을 잘못했다. – devwannabe

+0

Gruff Bunny, 추천 할 수있는 Lodash 도서가 있습니까? 아니면 API 설명서 이외의 훌륭한 자습서가있는 URL입니까? – devwannabe

+1

'Functional Javascript'(Michael Fogus)라는 밑줄 라이브러리를 사용하는 꽤 좋은 책이 있지만 밑줄에 대한 지침서는 아닙니다. 그 외에도 라이브러리에서 한 번에 하나의 기능 만 사용하여 작동하는 방법에 익숙해 질 때까지 사용하겠습니다. 지도와 축소를 잘 이해하면 이러한 프로그래밍 구조가 실제 세계에서 매우 자주 나타날 때 큰 도움이됩니다. –