1

重複の可能性:
文字列キーを使用してネストされたJavaScriptオブジェクトにアクセスする

私は機能を持っています

function _get(name) {
return plugin._optionsObj[name] !== undefined ? 
    plugin._optionsObj[name] : plugin._defaults[name];
}

_defaultsオブジェクト内にオブジェクトを入れたいのですが、オブジェクトを取得する方法がわかりませんが、角かっこを1セットだけ使用しています。

すなわち

plugin._defaults = {
    val1: 1,
    val2: 2,
    obj1: {
        someVal: 3
    }
}

上記の関数から「someVal」にアクセスすることは可能ですか?引数に「obj1.someVal」を渡そうとしましたが、機能しませんでした。アイデア?

編集:私は解決策を見つけました、そして私はそれを答えとして以下に投稿しました。ネストされた値を文字列で処理するための非常に優れた小さな関数を作成しました。関数を実装するために関数をあまり変更する必要はありませんでした。これが同じような状況の人に役立つことを願っています。

4

4 に答える 4

1

アクセスする 1 レベルのネストされたオブジェクトが常にあるとは限らないので、これを行うよりクリーンな方法は、文字列パスに基づいてオブジェクトをトラバースする関数を使用することです。Underscore の mixin としてコーディングされたものを次に示します。その後、次のように使用できます。

_.deep(plugin._defaults, 'obj1.someVal');

このスレッドには、アンダースコア以外の代替手段もいくつかあります。

于 2013-02-02T23:38:44.150 に答える
0

複数の引数を渡し、argumentsオブジェクトを反復処理します。

function _get(/* name1, name2, namen */) {
    var item = plugin._optionsObj,
        defItem = plugin._defaults;

    for (var i = 0; i < arguments.length; i++) {
        item = item[arguments[i]];
        defItem = defItem[arguments[i]];

        if (item == null || defItem == null)
            break;
    }
    return item == null ? defItem : item;
}

var opt = _get("obj1", "someVal")
于 2013-02-02T23:48:50.540 に答える
0

この問題の解決策を見つけました。少なくとも自分自身に対応できるものはあります。この問題で他の誰かを助けることができる場合に備えて、それを共有したいと思います. 私の最大の難点は、ネストされた値の深さを知らなかったことです。そのため、深くネストされたオブジェクトに対して、何も再設計する必要なく機能するソリューションを見つけたかったのです。

/* Retrieve the nested object value by using a string. 
   The string should be formatted by separating the properties with a period.
   @param   obj             object to pass to the function
            propertyStr     string containing properties separated by periods
   @return  nested object value. Note: may also return an object */

function _nestedObjVal(obj, propertyStr) {
var properties = propertyStr.split('.');
if (properties.length > 1) {
    var otherProperties = propertyStr.slice(properties[0].length+1);    //separate the other properties
        return _nestedObjVal(obj[properties[0]], otherProperties);  //continue until there are no more periods in the string
} else {
    return obj[propertyStr];
}
}


function _get(name) {
    if (name.indexOf('.') !== -1) {
    //name contains nested object
        var userDefined = _nestedObjVal(plugin._optionsObj, name);
        return userDefined !== undefined ? userDefined : _nestedObjVal(plugin._defaults, name);
    } else {
        return plugin._optionsObj[name] !== undefined ?
        plugin._optionsObj[name] : plugin._defaults[name];
    }
}
于 2013-02-03T00:39:03.267 に答える
-1

_defaults オブジェクト内のオブジェクトを取得するには、_get関数を改善する必要があります。

たとえば、文字列の配列 (プロパティ名を表す各文字列) を_getに渡して、深くネストされたオブジェクトへのアクセスを許可することができます。

于 2013-02-02T23:32:54.113 に答える