Search code examples
lodash

How to do this using lodash?


I have array of objects e.g

    [ { fName: 'Sohail',
    lName: 'Afzal',
    dob: 1995-07-08T19:00:00.000Z,
    gender: 'Male',
    phone: '(612)545-8924',
    phone1: '(123)456-7890',
    payorName: 'hashir',
    payorId: 12,
    affiliationDate: 2018-10-09T19:00:00.000Z },
  { fName: 'Joann',
    mName: 'Denise',
    lName: 'Gasner',
    dob: 1964-10-13T19:00:00.000Z,
    gender: 'Male',
    phone: '(612)990-8450',
    phone1: '(612)545-8924',
    payorName: 'Nouman Latif',
    payorId: 15,
    affiliationDate: 2018-10-10T19:00:00.000Z } ]

fetch some data from object and store in array then again push data into object. I need to group last three element into single array name payInfo

Output want like

[ { fName: 'Sohail',
        lName: 'Afzal',
        dob: 1995-07-08T19:00:00.000Z,
        gender: 'Male',
        phone: '(612)545-8924',
        phone1: '(123)456-7890',
        payInfo:[{payorName: 'hashir',
        payorId: 12,
        affiliationDate: 2018-10-09T19:00:00.000Z}]
       },
      { fName: 'Joann',
        mName: 'Denise',
        lName: 'Gasner',
        dob: 1964-10-13T19:00:00.000Z,
        gender: 'Male',
        phone: '(612)990-8450',
        phone1: '(612)545-8924',
        payInfo:[{payorName: 'Nouman Latif',
        payorId: 15,
        affiliationDate: 2018-10-10T19:00:00.000Z}] 
         } ]

Need to solve this with lodash.


Solution

  • You can do something like this:

    const data = [{ fName: 'Sohail', lName: 'Afzal', dob: '1995-07-08T19:00:00.000Z', gender: 'Male', phone: '(612)545-8924', phone1: '(123)456-7890', payorName: 'hashir', payorId: 15, affiliationDate: '2018-10-09T19:00:00.000Z' }, { fName: 'Joann', mName: 'Denise', lName: 'Gasner', dob: '1964-10-13T19:00:00.000Z', gender: 'Male', phone: '(612)990-8450', phone1: '(612)545-8924', payorName: 'Nouman Latif', payorId: 15, affiliationDate: '2018-10-10T19:00:00.000Z' } ]
    
    const result = _.map(data, x => 
       _.omit(_.extend(x, { payInfo: [{ 
          payorName: x.payorName, 
          payorId: x.payorId, 
          affiliationDate: x.affiliationDate 
       }] 
    }), ['payorName', 'payorId', 'affiliationDate']))
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

    Using the _.extend to decorate the object and _.omit to remove the old fields.

    With ES6 you can use Array.map and destructuring:

    const data = [{ fName: 'Sohail', lName: 'Afzal', dob: '1995-07-08T19:00:00.000Z', gender: 'Male', phone: '(612)545-8924', phone1: '(123)456-7890', payorName: 'hashir', payorId: 15, affiliationDate: '2018-10-09T19:00:00.000Z' }, { fName: 'Joann', mName: 'Denise', lName: 'Gasner', dob: '1964-10-13T19:00:00.000Z', gender: 'Male', phone: '(612)990-8450', phone1: '(612)545-8924', payorName: 'Nouman Latif', payorId: 15, affiliationDate: '2018-10-10T19:00:00.000Z' } ]
    
    const result = data.map(({payorName, payorId, affiliationDate, ...x}) => {
       x.payInfo = [{ payorName, payorId, affiliationDate }]
       return x
    })
    
    console.log(result)

    Or even more concise via Object.assign:

    const data = [{ fName: 'Sohail', lName: 'Afzal', dob: '1995-07-08T19:00:00.000Z', gender: 'Male', phone: '(612)545-8924', phone1: '(123)456-7890', payorName: 'hashir', payorId: 15, affiliationDate: '2018-10-09T19:00:00.000Z' }, { fName: 'Joann', mName: 'Denise', lName: 'Gasner', dob: '1964-10-13T19:00:00.000Z', gender: 'Male', phone: '(612)990-8450', phone1: '(612)545-8924', payorName: 'Nouman Latif', payorId: 15, affiliationDate: '2018-10-10T19:00:00.000Z' } ]
    
    const result = data.map(({payorName, payorId, affiliationDate, ...x}) => 
      Object.assign(x, {payInfo: [{ payorName, payorId, affiliationDate }]}))
    
    console.log(result)