Is there a simpler way than using ___ in object to check the existence of each level of an object to check the existence of a single member?
More concisely: How can I check if someObject.member.member.member.value exists?
In general, you can use if(property in object), but this would be still cumbersome for nested members.
You could write a function:
function test(obj, prop) {
var parts = prop.split('.');
for(var i = 0, l = parts.length; i < l; i++) {
var part = parts[i];
if(obj !== null && typeof obj === "object" && part in obj) {
obj = obj[part];
}
else {
return false;
}
}
return true;
}
test(someObject, 'member.member.member.value');
null. So it is maybe better to add a check for null as well. I added the test because 'value' in <primitive type> would throw an error. Added null test.undefined or the value of the last property. If this is set to undefined the you cannot distinguish. But assuming that you never set a value like that, it should be save. Honestly, I find it a bit harder to read though, and if you want to make reusable you'd have loops again... but both will work.Here's one way: http://jsfiddle.net/9McHq/
var result = ((((someObject || {}).member || {}).member || {}).member || {}).value;
alert( result );
Check out lodash-deep’s deepHas https://github.com/marklagendijk/lodash-deep#_deephascollection-propertypath
And this too https://github.com/danielstjules/hoops
if (someObject.member && someObject.member.member &&
someObject.member.member.member && someObject.member.member.member.value) ...
or similarly:
var val = foo.bar && foo.bar.jim && foo.bar.jim.jam && foo.bar.jim.jam.value;
This will not 'work' if any particular value happens to be null, false, 0, or "" (an empty string), but with the possible exception of the final value, this seems unlikely to be the case.
Also, note that typeof ____ !== "undefined" is not the correct test to see if an object has a property. Instead you should use ___ in object, e.g. if ("member" in someObject). This is because you can set a property to an explicit value of undefined, which is different from removing it with delete someObject.member.
Something like (warning: untested code ahead)
var testProperty = function(obj, proplist) {
for (var i=0; i < proplist.length; i++) {
if (obj.hasOwnProperty(proplist[i])) {
obj = obj[proplist[i]];
} else {
return false;
}
}
return true;
}
obj is null.Theres a safeRead function defined here on thecodeabode which allows a safeRead of nested properties i.e.
safeRead(foo, 'bar', 'jim', 'jam');
if any of the properties are null or undefined a blank string is returned - useful for formatting / string interpolation
If you can use lodash library, it has a very elegant solution, hasIn.
_.hasIn(someObject, 'member.level1.level2.level3');
for example,
var obj = {'x': 999, 'a': {'b': {'c': 123, 'd': 234}}}
// => undefined
_.hasIn(obj, 'x')
// => true
_.hasIn(obj, 'a.b.d')
// => true
_.hasIn(obj, 'a.b.e')
// => false