7

Trying to figure out what the easiest way to write a function keyExisits that checks and arbitrarily nested key to see if it exists in an object and is undefined, vs does not exisit.

assume this obj

var obj = {
  a: {
    b: 1,
    c: {
      d: 2,
      e: undefined
    }
  }
}

In this object the key a.c.e exists and is undefined, the key a.c.f does not exist

so

keyExists(obj, 'a.c.e') === true
keyExists(obj, 'a.c.f') === false

using lodash/underscore is ok

** UPDATE **

Lodash has works exactly like this

lonewarrior556
  • 3,917
  • 2
  • 26
  • 55

1 Answers1

3

You can try following

var obj = {a: {b: 1,c: {d: 2,e: undefined}}};

function keyExists(o, key) {
  if(key.includes(".")) {
    let [k, ...rest] = key.split(".");
    return keyExists(o[k], rest.join("."));
  } else if(o) {
    return o.hasOwnProperty(key);
  }
  return false;
}

console.log(keyExists(obj, 'a.c.e') === true)
console.log(keyExists(obj, 'a.c.f') === false)

Note: The above code will not work if there are any dots in the key name or you are using [] notation.

Nikhil Aggarwal
  • 28,197
  • 4
  • 43
  • 59
  • Performance wise, this seems quite counter productive to join the key just to split it again. It will also throw an `cannot read property of undefined` error if an intermediate key does not exist, i.e. `keyExists(obj, 'b.c.e')`. – riv Aug 30 '18 at 10:07