2016-11-15 16 views
0

JSON配列を2つのプロパティ(nameとaddress2)でグループ化して、それを減らしたいとします。ここでは、現在のJSONです: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 
} 

これは私が達成したいものです。

[ 
    { 
     "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関数内に "配送"オブジェクトの配列を作成する方法がわかりません。助けてください! :)

+0

あなたのコードだけではconsole.logプリントを働くかもしれない:あなたが使用Lodash機能の詳細情報を希望する場合は、ここでそれらのための公式ドキュメントです'[オブジェクト]'。 console.log(client.deliveris)にログを変更して何か変更があるか確認してください。 – Meir

+0

@Meir - 動作しません。配信内に配列が作成されるため、invoiceNumberは['1234'、 '5678']などになります。私は、これを達成するためには、forEachをそれぞれ繰り返し実行し、元の配列とマージされる個別の配送オブジェクトを作成しましたが、確かにより良い解決策が必要です。 – problematic

+0

[オブジェクト]の内容を知りたい場合。これを行う: 'var util = require( 'util'); –

答えて

1

使用あなたがグループから必要なプロパティを選び出す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()をコードに組み込むことで、少し簡潔にしていました。

本当にワンライナーが好きな人は、それも可能です。あなたには、いくつかの読みやすさを損なうかもしれないがLodashは、これを行うにはチェーン/ネスト関数に、それは簡単です:

// 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>


役に立てば幸い!

関連する問題