まず、PHPの@
は悪手なので使わないようにしましょう。
それエラーを無理やり握りつぶしてるだけなのでパフォーマンス的な話でちゃんと精査して取りに行く方が速度も出ます。
try catch を使うということになるのでしょうか?
try-catchの使い所さんは結構難しいのです。
基本的に完成したシステムにはバグがなくなるはずです。
tryつまり挑戦しなければならない場面で使いましょう。
具体的にはネットワークアクセス等で先方のWebサーバが生きてるかどうか保証しかねるようなケースで使用すべきです。
しかし、JavaScriptに於いて、他のシステムに問い合わせるという場面は基本的に非同期処理です。
第一引数errになるコールバック関数内でやれという思想で運用されていますから、
try-catchを使うタイミングというのは殆ど存在しません。
Promiseも.then(fn)
や.catch(fn)
でコントロールしますから
こちらもtry-catchの使用タイミングというのはほぼ皆無です。
Promiseの糖衣構文になるES7で追加されたasync/await構文では
try-catchを使うと自動的にPromiseのrejectを叩いて、.catch(fn)
で取り出したような動作になるはずなので、そのくらいでしょうか?
原因もわかってるようなので解決策だけ、
基本はLodashやRamdaなどの値操作の達人なライブラリを使うべきです。
Lodashならばget、
Ramdaならばpathで苦労もなく取得できます。
null
やundefined
が挟まり、
これらの値はプロパティを所持出来ずアクセスするとエラーになるはずですが…
存在しないパスが間に挟まっていても難なく取ってこれるのがわかるはずです。
このようにLodashやRamdaはPHPのビルトイン関数に匹敵する便利ライブラリですから、
せめてどちらかは採用して何時でも使えるようにしておくべきでしょう。
有名で流行っているLodashがオススメです。
ですが、ライブラリを実装出来ないケースでは下記のような関数を作って対処することをすすめます。
やっつけなので動作を保証してくださいという話なら
責任持てないので上記のようなライブラリを検討してください。
JavaScript
1const get = (obj, path) =>
2 path.split('.').reduce((obj, path) =>
3 obj == null ? undefined : obj[path]
4 , obj);
5
6// 使い方
7var obj = {
8 taro: {id: 1, age: 18, score: 80},
9 jiro: {id: 2, age: 17, score: 85},
10 busaro: {id: 3, age: 16, score: 75},
11};
12console.log(get(obj, 'taro.age'));
13// 18
14console.log(get(obj, 'taro.hoge.piko'));
15// undefined <- 存在しないパスが途中にくるが別にエラーにはならない