0

I have a Type described in typescript like this -

export type User = {
  name: string;
  username: string;
  phoneNumber: string;
  personalEmail?: string;
  workEmail?: string
}

I'm fetching some data from a json file which consists of objects like these and shaping the data to this type User for each object with this function

const shaper = (obj: any): User {
  const user: User = {
    name: obj.name,
    username: obj.username,
    number: obj.number,
    personalEmail: obj.personalEmail,
    workEmail: obj.workEmail,
  }

 // remove from user the fields which have value === undefined
  return user;
}

In the shaper function, I want to remove the fields of the variable user which have the value as undefined (eg : obj.personalEmail does not exist)

How do I achieve this?

tinuggunit
  • 39
  • 6
  • Assign property value individually and check if the value is `undefined` then don't assign it to `user` object. – DecPK May 20 '21 at 23:03
  • 1
    In most cases, you can just leave it assigned as `undefined`. – iz_ May 20 '21 at 23:30

2 Answers2

0

Here you have a working example.

You can use delete obj[key]

const shaper = (obj) => {
  const user = {
    name: obj.name,
    username: obj.username,
    number: obj.number,
    personalEmail: obj.personalEmail,
    workEmail: obj.workEmail,
  }

  Object.entries(user).forEach(([key, value]) => {
    if (value === undefined) {
      delete user[key];
      console.log("deleted", key);
    }
  });
  return user;
}

const shapedResult = shaper({
  name: "foo",
  workEmail: "bar@bar.com"
});

console.log(shapedResult);
Saissaken
  • 87
  • 4
0

You could do something like this:

/* Test Data */
const test = {
  name: 'name',
  username: 'username',
  needToRename: '123456789',
  another: 'blah',
  something: 'else',
  workEmail: 'hello@example.com'
}



/* Example 1 */
const shaper = ({name, username, needToRename:phoneNumber, personalEmail, workEmail}) => {
  return {
      name,
      username,
      phoneNumber,
      ...( personalEmail !== undefined && {personalEmail} ),
      ...( workEmail !== undefined && {workEmail})
  }
}
console.log(shaper(test));

Or you could extract the undefined check into a helper function and do this:

/* Test Data */
const test = {
  name: 'name',
  username: 'username',
  needToRename: '123456789',
  another: 'blah',
  something: 'else',
  workEmail: 'hello@example.com'
}

/* Example 2 */
function undefinedHelper(name, obj) {
  return obj[name] === undefined ? {} : {[name]: obj[name]};
}
const shaper2 = (obj) => {
  return {
      name: obj.name,
      username: obj.username,
      phoneNumber: obj.needToRename,
      ...undefinedHelper('personalEmail', obj),
      ...undefinedHelper('workEmail', obj)
  }
}
console.log(shaper2(test));

This answer was helpful: https://stackoverflow.com/a/40560953/2344607

theJasonHall
  • 126
  • 2
  • 5