15

以下のコードは私が望むことを実行しますが、避けたいと思いevalます。文字列で定義された名前でオブジェクトを検索する関数がJavascriptにありますか?

myobject = {"foo" : "bar"}
myname = "myobject";
eval(myname);

いくつかのコンテキスト:これは、dom内の多数のノードがhtml5data-object属性を持っているアプリケーションに使用しています。この属性は、モデルに接続するためのハンドラー関数で使用されます。

編集:myobjectはグローバルでもローカルでもありません。ハンドラーの親フレームの1つで定義されています。

4

4 に答える 4

22

変数がグローバルの場合:

myobject = {"foo" : "bar"};
myname = "myobject";
window[myname].foo

デモ

ローカルの場合:

(function(){
    myobject = {"foo" : "bar"};
    myname = "myobject";
    alert( this[myname].foo );
})();

デモ

于 2012-08-12T18:41:53.250 に答える
14

ローカル変数ソリューション:

アクセスしたいすべてのオブジェクトを、別のオブジェクトの文字列プロパティを使用して作成できます。例えば:

var objectHolder = {
    myobject: {"foo" : "bar"},
    myobject2: {"foo" : "bar"},
    myobject3: {"foo" : "bar"}
};

次に、次のように目的のオブジェクトにアクセスします。

var desiredObject = objectHolder["myobject"];

グローバル変数ソリューション:

次のような文字列を使用してグローバル変数にアクセスできます。

window["myobject"];
于 2012-08-12T18:38:39.107 に答える
7

この質問はかなり古いものですが、「javascript get object from string」というクエリのGoogleでの上位の結果であるため、ドット表記を使用したより長いオブジェクトパスの手法を共有したいと思いました。

次の場合:

var foo = { 'bar': { 'alpha': 'beta' } };

次のような文字列から「alpha」の値を取得できます。

var objPath = "bar.alpha";

var alphaVal = objPath.split('.')
  .reduce(function (object, property) {

    return object[property];
  }, foo);

// alphaVal === "beta"

グローバルの場合:

window.foo = { 'bar': { 'alpha': 'beta' } };

windowforとして渡すだけinitialValueですreduce

var objPath = "foo.bar.alpha";

var alphaVal = objPath.split('.')
  .reduce(function (object, property) {

    return object[property];
  }, window);

// alphaVal === "beta"

基本的reduceに、最初のオブジェクトをとして渡すことにより、オブジェクトメンバーをトラバースするために使用できますinitialValue

Array.prototype.reduceのMDN記事

于 2016-11-24T19:56:30.203 に答える
3

windowはグローバル名前空間であるため、次のように簡単に使用できます。

window[myname]
于 2012-08-12T18:41:12.367 に答える