dejwus
dejwus

Reputation: 13

Typescript/NestJS - extract object from db query response

I'm using external API to make an SQL query for a user. As a result i get matching Entity but as a set of fields, lookin like this:

[
  { IsNull: false, Name: 'Key', Value: '897', Values: null },
  { IsNull: false, Name: 'FirstName', Value: 'User', Values: null },
  { IsNull: false, Name: 'LastName', Value: 'Portal', Values: null },
  {
    IsNull: false,
    Name: 'Email',
    Value: '[email protected]',
    Values: null
  },
  { IsNull: true, Name: 'Salutation', Value: null, Values: null },
  { IsNull: false, Name: 'Type', Value: '2', Values: null },
  {
    IsNull: false,
    Name: 'LastLoggedDate',
    Value: '2022-12-01 15:24:03',
    Values: null
  }
]

How to transform this response to end with simple object { email: 'some@email', firstName: 'User' lastName: 'Portal' } ??

I ended up with solution like this (below) but i believe there's some easiest way to do that, especially with more fields

let userRawEntity = queryResult.data.Entities[0].Fields;
const userEmail = userRawEntity.filter((obj) => { return obj.Name === 'Email' });
const userFirstName = userRawEntity.filter((obj) => { return obj.Name === 'FirstName' });
const userLastName = userRawEntity.filter((obj) => { return obj.Name === 'LastName' });

return { email: userEmail[0].Value, firstName: userFirstName[0].Value, lastName: userLastName[0].Value };

Edit: final solution that works and looks nicer. thanks for help :)

      if (queryResult.data.TotalEntityCount > 0) {
        let user: {[key: string]: string | null } = {}
        let userRawEntity = queryResult.data.Entities[0].Fields;

        userRawEntity.forEach(data => user[data.Name] = data.Value);

        return { email: user.Email, currency: user.Currency } as JwtPayload;
      }

Upvotes: 1

Views: 799

Answers (2)

saumyajain125
saumyajain125

Reputation: 168

Another approach using lodash

_.mapValues(_.keyBy(data, "Name"), o => o.Value || o.Values);

Upvotes: 0

Sean Anglim
Sean Anglim

Reputation: 179

As a starting point, I would transform that entire array into an object as follows:

let dataTransformed: {[key: string]: string | null} = {}

data.forEach(d => {
    dataTransformed[d.Name] = d.Value
})

Which will give you a nicer looking object as follows:

{
    "Key": "897",
    "FirstName": "User",
    "LastName": "Portal",
    "Email": "[email protected]",
    "Salutation": null,
    "Type": "2",
    "LastLoggedDate": "2022-12-01 15:24:03"
}

You now have a familiar object with which to work with. From here, you can strip out the entries you don't want. Note, you may want to do further work in that array transformation such as checking for null values, changing keys to camel case, etc...

Upvotes: 1

Related Questions