Skip to content

Instantly share code, notes, and snippets.

@jasonrhodes
Created April 6, 2012 17:40
Show Gist options
  • Star 53 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save jasonrhodes/2321581 to your computer and use it in GitHub Desktop.
Save jasonrhodes/2321581 to your computer and use it in GitHub Desktop.
Get a nested object property by passing a dot notation string as the property name
/**
* A function to take a string written in dot notation style, and use it to
* find a nested object property inside of an object.
*
* Useful in a plugin or module that accepts a JSON array of objects, but
* you want to let the user specify where to find various bits of data
* inside of each custom object instead of forcing a standardized
* property list.
*
* @param String nested A dot notation style parameter reference (ie "urls.small")
* @param Object object (optional) The object to search
*
* @return the value of the property in question
*/
function getProperty( propertyName, object ) {
var parts = propertyName.split( "." ),
length = parts.length,
i,
property = object || this;
for ( i = 0; i < length; i++ ) {
property = property[parts[i]];
}
return property;
}
@bravin8
Copy link

bravin8 commented Jun 7, 2016

working perfectly.

@shiftyp
Copy link

shiftyp commented Jun 28, 2016

A functional answer might be (es2015 just because):

const getDescendantProp = (obj, path) => (
    path.split('.').reduce((acc, part) => acc && acc[part], obj)
);

@nhensh
Copy link

nhensh commented Feb 6, 2018

Does anyone know how i'd do this without knowing the object. Say if I wanted to simply convert the dot notation string to an object reference (as I don't need to return the value).

@MartinJHammer
Copy link

Masterful function. Just what I needed :) 🥇

@dolapci
Copy link

dolapci commented May 17, 2018

This is what i needed :) thank you

@laxa88
Copy link

laxa88 commented May 18, 2018

@jasonrhodes Awesome little gem here, thank you!

Just wanted to point out that this snippet fails if the property doesn't exist, e.g.:

getProperty('a.b.c', {a:{b:{}}});

Would there be any complications if I do a try ... catch in the loop and return undefined if it throws?

EDIT: just noticed the post by @doublejosh , seems like there's a simpler solution without involving try/catch. cheers!

@Hbahmani
Copy link

hi dudes

@Hbahmani
Copy link

is there anybody help me about angular 6?

@Hbahmani
Copy link

@laxa88 Hi

@my3sons
Copy link

my3sons commented Sep 10, 2018

I tried 10 other examples before this that all failed miserably, yours worked like a charm, thanks!

@jumpjack
Copy link

How can I get this working for something like obj->geometry[6]->obs[3]->latitude ?

@mp2468
Copy link

mp2468 commented Dec 27, 2019

Would anyone know how to do this to handle array as well? like being able to do
myVal = getDescendantProp(myData, 'someProperty.deeperProperty[0].evendeeperproperty');

@DavChi
Copy link

DavChi commented Apr 21, 2020

@mp2468 Based on this, we could use regex to handle both dot notation and bracket notation path.

const getDescendantProp = (obj, path) => {
  const arr = path.split(/[.[]['"]?/);
  let o = obj;
  while (arr.length && o) {
    o = o[arr.shift().replace(/['"]?]$/, '')];
  }
  return o;
};

@kissu
Copy link

kissu commented Jan 7, 2021

A functional answer might be (es2015 just because):

const getDescendantProp = (obj, path) => (
    path.split('.').reduce((acc, part) => acc && acc[part], obj)
);

Damn man, it doesn't even error if the path is not valid (no optional chaining needed), L33T. Thanks ! ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment