2016-11-15 65 views
0

我想通過兩個屬性(名稱和地址2)對JSON數組進行分組,然後將其減少。這是當前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 '[對象]'。嘗試將日誌更改爲console.log(client.deliveris)並查看它是否更改了任何內容 – Meir

+0

@Meir - 它不起作用,它在交付內創建數組,因此invoiceNumber變爲['1234','5678']等。我知道我可以通過運行額外的forEach來遍歷每個對象,並構建一個將與原始數組合並的獨立交付對象,但肯定必須有更好的解決方案。 – problematic

+0

如果您想知道[對象]中的內容。這樣做:'var util = require('util'); console.log(util.inspect(data,{showHidden:false,depth:null}));' –

回答

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>


希望幫助!如果您想使用的功能Lodash更多信息,下面是他們的官方文檔: