2016-11-15 1 views
0

JSON 배열을 두 속성 (name 및 address2)으로 그룹화 한 다음 줄이려고합니다.lodash를 사용하여 여러 그룹핑 적용

{ 
    "clientId": "FOO", 
    "name": "John Doe", 
    "address1": "London", 
    "address2": "1 High Street", 
    "invoiceNumber": "1234", 
    "itemDescription": "Item 1", 
    "itemQuantity": 1 
}, 
{ 
    "clientId": "BAR", 
    "name": "John Doe", 
    "address1": "London", 
    "address2": "1 Oxford Street", 
    "invoiceNumber": "0987", 
    "itemDescription": "Item 2", 
    "itemQuantity": 1 
}, 
{ 
    "clientId": "FOO", 
    "name": "John Doe", 
    "address1": "London", 
    "address2": "1 High Street", 
    "invoiceNumber": "5678", 
    "itemDescription": "Item 3", 
    "itemQuantity": 1 
} 

이 내가 달성하고 싶은 무엇인가 : 다음은 현재 JSON은

[ 
    { 
     "clientId": "FOO", 
     "name": "John Doe", 
     "address1": "London", 
     "address2": "1 High Street", 
     "deliveries": [ 
      { 
       "invoiceNumber": "1234", 
       "itemQuantity": 1, 
       "itemDescription": "Item 1" 
      }, 
      { 
       "invoiceNumber": "5678", 
       "itemDescription": "Item3", 
       "itemQuantity": 1 
      } 
     ] 
    }, 
    { 
     "clientId": "BAR", 
     "name": "JohnDoe", 
     "address1": "London", 
     "address2": "12 Oxford Street", 
     "deliveries": [ 
      { 
       "invoiceNumber": "0987", 
       "itemDescription": "Item2", 
       "itemQuantity": 1 
      } 
     ] 
    } 
] 

을 그리고 여기 내가 희망 어떻게 생성하지 않습니다 내가 지금까지 가지고있는 코드입니다 것 :

 var groups = _.groupBy(rows, function(value) { 
      return value.name + '#' + value.address2; 
     }); 

     var data = _.map(groups, function(group) { 
      return { 
       clientId: group[0].clientId, 
       name: group[0].name, 
       address1: group[0].address1, 
       address2: group[0].address2, 
       deliveries: [{ 
        invoiceNumber: _.map(group,'invoiceNumber'), 
        itemDescription: _.map(group,'itemDescription'), 
        itemQuantity: _.map(group,'itemQuantity'), 
       }] 
      } 
     }); 

그리고 그것은 다음과 같은 출력이 생성

[ { clientId: 'FOO', 
    name: 'John Doe', 
    address1: 'London', 
    address2: '1 High Street', 
    deliveries: [ [Object] ] } ] 

lodash _map 함수 내에서 "delivery"객체의 배열을 만드는 방법을 모르겠습니다. 도와주세요! :)

+0

귀하의 코드는 바로 CONSOLE.LOG 인쇄를 작동 할 수 있습니다 : 당신이 사용하는 Lodash 함수에 대한 자세한 정보를 원하는 경우, 여기에 대한 공식 문서입니다 '[객체]'. console.log (client.deliveris)로 로그를 변경하고 아무것도 변경되지 않았는지 확인하십시오. – Meir

+0

@Meir - 작동하지 않고 전달 내에 배열을 작성하므로 invoiceNumber는 [1234 ','5678 '] 등이됩니다. . 추가로 forEach를 실행하여 각 작업을 반복함으로써이 작업을 수행 할 수 있음을 알고 원본 배열과 병합 될 별도의 전달 개체를 작성했지만 더 나은 솔루션이 반드시 있어야합니다. – problematic

+0

[Object]에 무엇이 있는지 알고 싶다면. 이렇게하십시오 :'var util = require ('util'); –

답변

1

사용 그룹에서 원하는 속성을 선택합니다 하나 개의 맵 :

... deliveries: _.map(group, item => _.pick(item, ['invoiceNumber', 'itemDescription', 'itemQuantity' ])) ...

+0

나는 다음과 같이 대답하려고했다 :'deliveries : _.map (group, function (g) {return _.pick (g, [ "invoiceNumber", "itemDescription", "itemQuantity"])}))' –

0

당신은하지 멀리 떨어져 있었다!

Gruff가 제안한대로 ES6 구문을 사용하고 _.pick()을 코드에 통합하여 좀 더 간결하게 만들어야했습니다.

정말로 원 라이너가 마음에 들면, 그것도 가능합니다!

// Data: 
 
const rows = [{ 
 
    "clientId": "FOO", 
 
    "name": "John Doe", 
 
    "address1": "London", 
 
    "address2": "1 High Street", 
 
    "invoiceNumber": "1234", 
 
    "itemDescription": "Item 1", 
 
    "itemQuantity": 1 
 
}, 
 
{ 
 
    "clientId": "BAR", 
 
    "name": "John Doe", 
 
    "address1": "London", 
 
    "address2": "1 Oxford Street", 
 
    "invoiceNumber": "0987", 
 
    "itemDescription": "Item 2", 
 
    "itemQuantity": 1 
 
}, 
 
{ 
 
    "clientId": "FOO", 
 
    "name": "John Doe", 
 
    "address1": "London", 
 
    "address2": "1 High Street", 
 
    "invoiceNumber": "5678", 
 
    "itemDescription": "Item 3", 
 
    "itemQuantity": 1 
 
}]; 
 

 
// Result: 
 
const groups = _.groupBy(rows, item => item.clientId); 
 
const result = _.map(groups, group => { 
 
    const {clientId, name, address1, address2} = group[0]; 
 
    const deliveries = _.map(group, item => _.pick(item, ['invoiceNumber', 'itemDescription', 'itemQuantity'])); 
 
    return {clientId, name, address1, address2, deliveries}; 
 
}); 
 
console.log('multi-liner result: ', result); 
 

 
// One-line version: 
 
const oneLiner = _.map(_.groupBy(rows, item => item.clientId), group => _.merge(_.pick(group[0], ['clientId', 'name', 'address1', 'address2']), {deliveries: _.map(group, item => _.pick(item, ['invoiceNumber', 'itemDescription', 'itemQuantity']))})); 
 
console.log('one-liner result: ', oneLiner);
<script src="https://cdn.jsdelivr.net/lodash/4.17.1/lodash.min.js"></script>


희망하는 데 도움이 : 일부 가독성을 손상시킬 수 있지만 Lodash는이 작업을 수행하기 위해 체인/둥지 기능에 쉽게 만든다!