performance - Most efficient Javascript way to check if an object within an unknown object exists -


this question has answer here:

this come against quite in javascript. let's have object this:

var acquaintances = {    types: {       friends: {          billy: 6,          jascinta: 44,          john: 91          others: ["matt", "phil", "jenny", "anna"]       },       coworkers: {          matt: 1       }    } } 

in theoretical program, know sure acquaintances object; have no idea whether acquaintances.types has been set, or whether friends has been set within it.

how can efficiently check whether acquaintances.types.friends.others exists?

what is:

if(acquaintances.types){   if(aquaintances.types.friends){     if(acquaintances.types.friends.others){        // stuff "others" array here     }    } } 

aside being laborious, these nested if statements bit of nightmare manage (in practice objects have far more levels this!). if try if(acquaintances.types.friends.others){) straight off bat, , types hasn't been set yet, program crash.

what ways javascript have of doing in neat, manageable way?

an alternative approach is:

((acquaintances.types || {}).friends || {}).others 

which shorter other solutions, may or may not thrill you.

you can build little helper make same idea tiny bit more palatable:

function maybe(o) { return o || {}; } 

now can do

maybe(maybe(acquaintances.types).friends).others 

if don't mind writing property names strings, make little helper:

function maybe(obj) {   return object.defineproperty(     obj || {},      'get',      { value: function(prop) { return maybe(obj[prop]); }   ); } 

now can write

maybe(acquaintances.types').get('friends').others 

in es6, can this, albeit clumsily, using destructuring assignment defaults:

var { types: { friends: { others } = {} } = {} } = acquaintances; 

if want use in expression context, instead of assigning variable, in theory use argument destructuring:

(({ types: { friends: { others } = {} } = {} }) => others)(acquaintances) 

after said , done, standard approach remains

acquaintances.types &&    acquaintances.types.friends &&    acquaintances.types.friends.others 

this why there active (?) discussion in es6 design groups coffeescript-like existential operator, not seem converging rapidly.


Comments

Popular posts from this blog

dns - How To Use Custom Nameserver On Free Cloudflare? -

python - Pygame screen.blit not working -

c# - Web API response xml language -