Puis-je utiliser le mot-clé 'in' pour tester une propriété dans un objet (arbre)

Disons que j'ai l'objet suivant:

Variables.settings.backend.url = 'http://localhost'; 

Ce que je ferais pour tester est url est disponible, est fait pour ce qui suit:

 if ('settings' in Variables && 'backend' in Variables.settings && 'url' in Variables.settings.backend) { // true } 

C'est assez encombrant.

Si c'était PHP, je pourrais simplement faire

 if (!empty($variables['settings']['backend']['url']) { //true } 

Est-ce que cela peut être simplifié dans JS?

J'ai écrit une fonction pour tester ceci:

 var isModuleDefined = function(moduleName) { var d = moduleName.split("."); var md = d[0]; for (var i = 1, len = d.length; i <= len; i++) { if (eval("typeof " + md) !== "undefined") { md = md + "." + d[i]; continue; } break; } return i === len + 1; }; isModuleDefined("Variables.settings.backend.url"); 

Mais je ne connais vraiment pas la rentabilité de cette méthode, en utilisant eval.

Modifier (sans eval ..):

 var isModuleDefined = function(moduleName) { var d = moduleName.split("."); var base = window; for (var i = 0, len = d.length; i < len; i++) { if (typeof base[d[i]] != "undefined") { base = base[d[i]]; continue; } break; } return i === len; }; 

Encore une autre variante

 function isFieldExist(expression){ var fields = expression.split('.'), cur = this; for(var i=0; i<fields.length; i++){ if(typeof cur[fields[i]] === "undefined") return false; cur = cur[fields[i]]; } return true; } 

pour l'utilisation

 isFieldExist("Variables.settings.backend.url"); // find in global scope isFieldExist.call(Variables, "settings.backend.url"); // find in Variables