2016-11-15 5 views
0

Я хотел бы сгруппировать массив JSON двумя свойствами (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 отпечатки '[объект]'. Попытайтесь изменить свой журнал на console.log (client.deliveris) и посмотреть, не изменит ли он что-либо – Meir

+0

@Meir - он не работает, он создает массивы в пределах поставок, поэтому invoiceNumber становится ['1234', '5678'] и т. Д. , Я знаю, что могу добиться этого, запустив дополнительное forEach для итерации по каждому из них и создав отдельный объект доставки, который будет объединен с исходным массивом, но, безусловно, должно быть лучшее решение. – problematic

+0

Если вы хотите узнать, что находится в [Object]. Сделайте это: 'var util = require ('util'); console.log (util.inspect (data, {showHidden: false, depth: null})); ' –

ответ

1

Используйте один карта, которая выбирает нужные свойства из группы:

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

+0

Я собирался ответить на это:' deliveryies: _.map (group, function (g) {return _.pick (g, ["invoiceNumber", "itemDescription", "itemQuantity"])}) ' –

0

Вы были не за горами!

Если вы хотите сделать это немного более сжатым, используя синтаксис 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 используемых, вот официальная документация для них:

Смежные вопросы