1

For example :

data = {info: {name: john}}

How can I make sure when doing :

const name = data.info.name

That name exists, and I won't get : Can't read value name of undefined

Right now I'm doing :

let name 

if(!!data && data.info && data.info.name){
  name = data.info.name
}

But it seems messy, wondering if there's a better way

gnifrus
  • 243
  • 1
  • 2
  • 6

1 Answers1

3

You don't need an if statement, you can assign the expression directly:

const data = {info: {name: 'john'}};
const name = data && data.info && data.info.name
console.log(name);

const data2 = {};
const name2 = data2 && data2.info && data2.info.name;
console.log(name2);

You can use destructuring assignment with defaults:

const data = {info: {name: 'john'}};

const { info: { name } = {}} = data || {};

console.log(name);

const data2 = undefined;

const { info: { name2 } = {}} = data || {};

console.log(name2);

There's also the TC39 stage 1 proposal - optional chaining, which you can use with a babel plugin:

const data = {info: {name: 'john'}};
// if any part of chain is undefined, name will be undefined
const name = data?.info?.name; 
Ori Drori
  • 183,571
  • 29
  • 224
  • 209