26

ドット表記を使用してネストされたオブジェクトにアクセスするときは、常に前のオブジェクトが存在することを確認する必要があり、かなり疲れます。

チェーンが好きなら基本的にロングは避けたい

if (a && a.b && a.b.c && a.b.c[0] ... ) { v = a.b.c[0]; }

私が考えることができる唯一の他のことは、try catch を使用することです。

var v; try { v = a.b.c[0].d.e; } catch (e) {}

これにはより良いパターンがありますか?

4

4 に答える 4

2

私はあなたがすでに2つの最も美しい解決策を持っていると思います.

ただし、たとえば、obj.obj.string.length次の場合、最初のソリューションは失敗することに注意してくださいstring === ""&&空の文字列は false であるため、ガードがトリップします。

しかし、文字列について言えば、次のようなことができます。

function getNestedProperty(obj, propChain) {
    var props = propChain.slice(0), prop = props.shift();
    if(typeof obj[prop] !== "undefined") {
        if(props.length) {
            return getNestedProperty(obj[prop], props);
        } else {
            return obj[prop];
        }
    }
}

var v = getNestedProperty(a, ["b", "c", 0, "d", "e"]);

ええ...あまりきれいではありません:P

try...catch提案された解決策の中で、おそらく最も簡単な方法だと思います

于 2013-11-05T18:45:56.517 に答える
0

これはどう:

var hasProperty = function (object, property) {

    var properties = property.split('.'),
        temp = object;

    while (temp && properties.length) {
        temp = temp[properties.shift()];
    }

    return !!temp;
};

そしてそれを次のように使用します:

if (a && hasProperty(a, 'b.c.0' ) { v = a.b.c[0]; }
于 2013-11-05T19:49:14.950 に答える