2013-02-15 32 views
6

obj.prop.otherprop.anotherなどのオブジェクトプロパティが定義されているかどうかを確認するには、プロパティが定義されているかどうかを確認するJavaScriptチェック

if(obj && obj.prop && obj.prop.otherprop && obj.prop.otherprop.another) 

これはうまくいくが、十分に醜い。

+0

http://stackoverflow.com/questions/135448/how-do-i-check-to-see-if-an-object-has-a-property-in-javascript – JonH

+0

@JonHなし、本当にそうではありません... –

答えて

3

これを行う最も効率的な方法は、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 ; 
} 
+0

してくださいこれを使用しないでください。これは私にこれを示唆するばかげたばかりです。 – jagzviruz

0

が...これは良いですが、

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'); 

を言っていない...しかし、私は、実際の答えはBEST-がないことだと思いますこれを練習する。私は気づいていない。

0

あなたは愚かな気分にしている場合、これは動作します:

if ((((obj || {}).prop || {}).anotherprop || {}).another) { ... } 

しかし、3の新しいオブジェクトを初期化すると、繰り返しのパスを入力する必要がない、本当に価値があるかどうかはわかりません。

関連する問題