4

このようなチェーン コールを短縮する方法はありますか?

if (obj && obj.prop && obj.prop.subProp1 && obj.prop.subProp1.subPropFunc) {
    obj.prop.subProp1.subPropFunc();
}

私が想像できる唯一の選択肢はtry-catch. 他のアイデアはありますか?
※本当に書き疲れました。を使用すると、 の方がはるかに簡単です?.

4

2 に答える 2

1

これは、サンプルコード(「すべてのケース」をテストしておらず、サンプルのコピーのみ)を指定すると機能するはずです。

function propsExist(obj) {
    if (!obj) return false;
    for (var i = 1; i < arguments.length; i++) {
        if (!obj[arguments[i]]) return false;
        obj = obj[arguments[i]];
    }
    return true;
}

if (propsExist(obj, "prop", "subProp1", "subPropFunc")) {
    obj.prop.subProp1.subPropFunc();
}

このメソッドpropsExist()は可変数の引数を取ります。最初の引数は、プロパティ/関数をチェックする元のオブジェクトです。送信したプロパティのリストを繰り返し処理し、順番にチェックします。存在しない場合は、を返しfalseます。ループ全体を通過した場合は、正常に検証されています。

検証された場合にサブプロパティの関数を常に呼び出したい場合は、trueを返す代わりに、関数を呼び出すように変更することもできますpropsExist(次に、関数の名前を次のように変更します。callIfValid(obj, ...)

于 2012-10-11T12:28:34.457 に答える
1

前の投稿と同じアイデアですが、別のソリューションです。

function checkChain(variablePath,startingPoint){
    var check = startingPoint || window,
        parts =  variablePath.split("."),
        i;

    for (i=0;i<parts.length;i++) {
        check = check[parts[i]];
        if (!check) {
            return null;
        }
    }
    return check;
}

var foo = { bar : { cat : { says : function(x){ alert(x); } } } };

var test1 = checkChain("foo.bar.cat.says");
if (test1) {
    test1("meow");
}

var test2 = checkChain("foo.bar.cat.bark");
if (test2) {
    test2("burp");
}

var test3 = checkChain("cat.says",foo.bar);
if (test3) {
    test3("huh?");
}
于 2012-10-11T12:31:56.500 に答える