Test for existence of nested JavaScript object key Test for existence of nested JavaScript object key javascript javascript

Test for existence of nested JavaScript object key


You have to do it step by step if you don't want a TypeError because if one of the members is null or undefined, and you try to access a member, an exception will be thrown.

You can either simply catch the exception, or make a function to test the existence of multiple levels, something like this:

function checkNested(obj /*, level1, level2, ... levelN*/) {  var args = Array.prototype.slice.call(arguments, 1);  for (var i = 0; i < args.length; i++) {    if (!obj || !obj.hasOwnProperty(args[i])) {      return false;    }    obj = obj[args[i]];  }  return true;}var test = {level1:{level2:{level3:'level3'}} };checkNested(test, 'level1', 'level2', 'level3'); // truecheckNested(test, 'level1', 'level2', 'foo'); // false

ES6 UPDATE:

Here is a shorter version of the original function, using ES6 features and recursion (it's also in proper tail call form):

function checkNested(obj, level,  ...rest) {  if (obj === undefined) return false  if (rest.length == 0 && obj.hasOwnProperty(level)) return true  return checkNested(obj[level], ...rest)}

However, if you want to get the value of a nested property and not only check its existence, here is a simple one-line function:

function getNested(obj, ...args) {  return args.reduce((obj, level) => obj && obj[level], obj)}const test = { level1:{ level2:{ level3:'level3'} } };console.log(getNested(test, 'level1', 'level2', 'level3')); // 'level3'console.log(getNested(test, 'level1', 'level2', 'level3', 'length')); // 6console.log(getNested(test, 'level1', 'level2', 'foo')); // undefinedconsole.log(getNested(test, 'a', 'b')); // undefined