6

obj.prop.otherprop.another のようなオブジェクト プロパティが定義されているかどうかを確認するための推奨される方法は何ですか?

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

これはうまく機能しますが、十分に醜いです。

4

3 に答える 3

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 ;
}
于 2013-02-15T18:13:13.567 に答える
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');

...しかし、実際の答えは、これに対するベストプラクティスがないということだと思います。私が知っていることではありません。

于 2013-02-15T17:51:12.630 に答える
0

あなたが愚かな気分になっているなら、これはうまくいくでしょう:

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

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

于 2013-02-15T18:01:27.227 に答える