1

オブジェクトからより深いプロパティを取得するのは面倒なことで有名です。親が存在しない場合は、エラーが発生します。したがって、親が存在しない場合は、プロパティへのアクセスを停止する必要があります。

これを行う無知な方法は次のとおりです。

if (parent.value && parent.value.subvalue && parent.value.subvalue.targetvalue)
    var myVal = parent.value.subvalue.targetvalue;
else
    var myVal = null;

プロパティを頻繁に取得する必要がある場合、これは機能せず、ショートカット機能が必要です。最初に私はこのようなことをしました:

function getProp(path) {
    try {
        return eval(path);
    }
    catch (e) {
        return null;
    }
};
// getProp('parent.value.subvalue.targetvalue');

しかし、これは少なくとも 2 つの理由で不十分です: オブジェクトはスコープ内になければならず、誰も を使いたがりませんeval()

したがって、オブジェクトを関数に適用する方が良いかもしれません:

function getProp(path, parent) {
    path = path.split('.');

    var val = parent;

    for (var k = 0; k < path.length; k++) {
        var key = path[k];

        try {
            val = val[key];
        }
        catch (e) {
            return null;
        }
    }

    return val;
};
// getProp('value.subvalue.targetvalue', parent);

しかし、なんとなくまだ気分が乗らない。
これどうやってやるの?ベストプラクティスとは?

親が存在する場合と存在しない場合があるオブジェクトの深いプロパティを設定することは、さらに面倒です。

parent = parent || {};
parent.value = parent.value || {};
parent.value.subvalue = parent.value.subvalue || {};
parent.value.subvalue.target = "YAY SOME VALUE!"

どうすればうまく対処できますか?

これは頻繁に行う必要があるため、これに対する JavaScript ネイティブ関数はまだありますか?

4

2 に答える 2

3

組み込みの方法、いいえ。Node.js プラットフォームを使用している場合は、 dotty などのパッケージを試すことができます

とにかく、あなたがそれを行うことができると私が思う方法は、次のようなものです(私はそれをテストしていません!しかし、私はそれがうまくいくと思います):

key.split( "." ).reduce(function( memo, part ) {
   if ( typeof memo !== "object" || memo[ part ] === undefined ) {
      return;
   }

   return memo[ part ];
}, obj );
于 2013-10-31T23:50:39.177 に答える