いいえ、あなたはすでに正しい方法を見つけました。もちろん、try/catch
ブロックを使用してエラー後の処理を行うことができますが、x && x.y && x.y.z && x.y.z.a
ソリューションを使用します。
あなたは本当にそれが1
または"hi"
だときa
がtrue
としないように厳密に等しい場合のみに条件が真である場合を除き、(あなたが=== true
は必要ありませんが、あなたの質問から、私はあなたがその既に知っていると思っています。)あなたは、このための機能を使用したくないと述べてきた、と私はちょうどフィットし、笑いのために、どちらか一方の必要性を感じていない
:
function ref(obj, names) {
var rv = obj, index;
if (names) {
for (index = 0; rv && index < names.length; ++index) {
rv = rv[names[index]];
}
}
return rv;
}
使い方:
if (ref(x, ["y", "z", "a"]) === true) {
// do something
}
関数呼び出しがso cheap these daysです...
または交互:
function ref(obj) {
var rv = obj, index;
for (index = 1; rv && index < arguments.length; ++index) {
rv = rv[arguments[index]];
}
return rv;
}
使用法:
if (ref(x, "y", "z", "a") === true) {
// do something
}
...しかし、ほとんどのJavaScriptエンジンで、その遅くなります(arguments
が遅くなる傾向があります)。しかし、再び、スピードが問題になるためには、ループで何千回も繰り返さなければなりません。
それとも
サイムが示唆するように、単一の変数(私は
split
を避けたが、それは高価ではありません):
function ref(obj, path) {
var rv = obj, names = path.split("."), index;
for (index = 0; rv && index < names.length; ++index) {
rv = rv[names[index]];
}
return rv;
}
使用法:
if (ref(x, "y.z.a") === true) {
// do something
}
Live example of all three | Live source
最後の1つが最短のものです。より長い名前の場合は、 'var tmp = x; if(tmp =&tmp.verylongname)&&(tmp = tmp.evenlongernameblabla)&&(tmp = tmp.doyougetit)){...} '。 –
この場合、特別な関数を使いたいと思うでしょう。 –
@Jesseあなたは例を挙げることができますか? – Sherzod