obj.prop.otherprop.another のようなオブジェクト プロパティが定義されているかどうかを確認するための推奨される方法は何ですか?
if(obj && obj.prop && obj.prop.otherprop && obj.prop.otherprop.another)
これはうまく機能しますが、十分に醜いです。
obj.prop.otherprop.another のようなオブジェクト プロパティが定義されているかどうかを確認するための推奨される方法は何ですか?
if(obj && obj.prop && obj.prop.otherprop && obj.prop.otherprop.another)
これはうまく機能しますが、十分に醜いです。
これを行う最も効率的な方法は、try{} catch(exception){} ブロックで obj.prop.otherprop.another をチェックすることです。残りがすべて存在する場合、これが最速です。それ以外の場合、例外が処理されます。
var a = null;
try {
a = obj.prop.otherprop.another;
} catch(e) {
obj = obj || {};
obj.prop = obj.prop || {};
obj.prop.otherprop = obj.prop.otherprop || {};
obj.prop.otherprop.another = {};
a = obj.prop.otherprop.another ;
}
これが良いとは言わないが...
x = null
try {
x = obj.prop.otherprop.another;
} catch() {}
// ...
または代わりに...
function resolve(obj, path) {
path = path.split('.');
while (path.length && obj) obj = obj[path.shift()];
return obj;
}
x = resolve(obj, 'prop.otherprop.another');
...しかし、実際の答えは、これに対するベストプラクティスがないということだと思います。私が知っていることではありません。
あなたが愚かな気分になっているなら、これはうまくいくでしょう:
if ((((obj || {}).prop || {}).anotherprop || {}).another) { ... }
しかし、3つの新しいオブジェクトを初期化することが、パスを繰り返し入力する必要がないのに本当に価値があるかどうかはわかりません。