web-dev-qa-db-ja.com

JavaScriptで文字列を変数名に変換する

私は解決策を探しましたが、そのような解決策を見つけることができませんでした。

onlyVideoという変数があります。

"onlyVideo"文字列は関数に渡されます。関数内で変数onlyVideoを何かに設定したい。どうやってやるの?

(関数に呼び出すことができる変数がいくつかあります。したがって、動的に機能するためには、ハードコードされたifステートメントではなく、変数が必要です。)

編集:あなたがやろうとしていることをするより良いやり方がおそらくあるでしょう。私はJavaScriptの冒険の早い段階でこれを尋ねました。 JavaScriptオブジェクトがどのように機能するかを調べてください。

簡単な紹介

// create JavaScript object
var obj = { "key1": 1 };

// assign - set "key2" to 2
obj.key2 = 2;

// read values
obj.key1 === 1;
obj.key2 === 2;

// read values with a string, same result as above
// but works with special characters and spaces
// and of course variables
obj["key1"] === 1;
obj["key2"] === 2;

// read with a variable
var key1Str = "key1";
obj[key1Str] === 1;
226
switz

もしそれがグローバル変数ならwindow[variableName]あるいはあなたの場合window["onlyVideo"]がうまくいくはずです。

251
ingo

Javascriptにはそのような場合のためのeval()関数があります。

function (varString) {
  var myVar = eval(varString);
  // .....
}

編集:すみません、私はあまりにも早く質問をすくい取ったと思います。これはあなたに必要な変数を設定するための変数を取得するだけです。

function SetTo5(varString) {
  var newValue = 5;
  eval(varString + " = " + newValue);
}

または文字列を使用している場合:

function SetToString(varString) {
  var newValue = "string";
  eval(varString + " = " + "'" + newValue + "'");
}

しかし、私はあなたが探しているものを達成するためのより適切な方法があると思いますか?大きな理由がない限り、eval()を本当に使いたいとは思わない。 eval()

149
goggin13

Eval対グローバル変数ソリューションに関しては...

それぞれに利点があると思いますが、これは本当に誤った二分法です。あなたがグローバルネームスペースに妄想している場合は、一時ネームスペースを作成するだけで、同じテクニックを使用できます。

var tempNamespace = {};
var myString = "myVarProperty";

tempNamespace[myString] = 5;

保存にウィンドウを使用しなくても、tempNamespace.myVarProperty(現在は5)としてアクセスできることを確認してください。 (文字列は括弧に直接入れることもできます)

38
jm0
var myString = "echoHello";

window[myString] = function() {
    alert("Hello!");
}

echoHello();

邪悪な評価に対してノーと言う。ここでの例: https://jsfiddle.net/Shaz/WmA8t/

15
Shaz

連想配列としてウィンドウオブジェクトにアクセスし、そのように設定することができます。

window["onlyVideo"] = "TEST";
document.write(onlyVideo);
8
Eric Conner

Window ['variableName']メソッドは、変数がグローバルスコープで定義されている場合にのみ機能します。正解は「リファクタリング」です。 「オブジェクト」コンテキストを提供できる場合は、考えられる一般的な解決策がありますが、変数のスコープに基づいてグローバル関数が解決できない変数がいくつかあります。

(function(){
    var findMe = 'no way';
})();
7

あなたがオブジェクトのプロパティにアクセスしようとしているなら、あなたはwindowのスコープから始めて、あなたが望むものに到達するまでオブジェクトのそれぞれのプロパティを通過しなければなりません。 a.b.cがスクリプト内の別の場所で定義されていると仮定すると、以下を使用できます。

var values = window;
var str = 'a.b.c'.values.split('.');

for(var i=0; i < str.length; i++)
    values = values[str[i]];

どんなに深いオブジェクトであっても、これは任意のオブジェクトのプロパティを取得するのに役立ちます。

4
user1846065

あなたはこうすることができます

var name = "foo";
var value = "Hello foos";
eval("var "+name+" = '"+value+"';");
alert(foo);
2

次のコードを使用すると、JavaScriptで各DIVおよびその他のHTML要素を簡単に参照できます。このコードは、すべてのHTML要素が表示されるように、タグの直前に含める必要があります。それにあなたのJavaScriptコードが続くべきです。

// For each element with an id (example: 'MyDIV') in the body, create a variable
// for easy reference. An example is below.
var D=document;
var id={}; // All ID elements
var els=document.body.getElementsByTagName('*');
for (var i = 0; i < els.length; i++)
    {
    thisid = els[i].id;
    if (!thisid)
        continue;
    val=D.getElementById(thisid);
    id[thisid]=val;
    }

// Usage:
id.MyDIV.innerHTML="hello";
0
David Spector

こんなことができます

(function(X, Y) {
  
  // X is the local name of the 'class'
  // Doo is default value if param X is empty
  var X = (typeof X == 'string') ? X: 'Doo';
  var Y = (typeof Y == 'string') ? Y: 'doo';
  
  // this refers to the local X defined above
  this[X] = function(doo) {
    // object variable
    this.doo = doo || 'doo it';
  }
  // prototypal inheritance for methods
  // defined by another
  this[X].prototype[Y] = function() {
    return this.doo || 'doo';
  };
  
  // make X global
  window[X] = this[X];
}('Dooa', 'dooa')); // give the names here

// test
doo = new Dooa('abc');
doo2 = new Dooa('def');
console.log(doo.dooa());
console.log(doo2.dooa());
0
yunzen