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


260

解決策を探しましたが、その解決策は見つかりませんでした。

という変数があります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;

5
これは何のために使用しますか?それを通常のローカル変数に設定する必要があると確信していますか?オブジェクト(ハッシュ)は機能しませんか?
Dogbert

うーん...配列のある世界でなぜこれをしたいのかはまだよくわかりません。とにかく、あなたのコードと説明のいくつかは大いに役立ちます。
ケビンチャベス

私はあなたの最終的な目標が何であるかについてより詳細が必要だと思います
mcgrailm '10

回答:


280

それがグローバル変数のwindow[variableName] 場合window["onlyVideo"]は、またはあなたの場合はトリックを行う必要があります。


35
でも、グローバルではない場合、あなたはそのようにすることによって、それをアクセスすることができscope[property]、あるいはthis[property]
ヴォイチェフBednarski

7
@WojciechBednarski:スコープとコンテキストを混同しないでください。thisコンテキストであり、それが指すものは、関数の呼び出し方法によって異なります。JSでは、時間の50%がthisあるwindowあなたがstrictモードを有効にしない限りthisになりundefined、エラーがスローされます。スコープは完全に異なるものであり、オブジェクトではありません(windowオブジェクトによってミラーリングされるグローバルスコープを除く)
slebetman

3
機能しませんWebWorkers(ここで、selfそれはそれはに等しいのブラウザで同じようにグローバルスコープreffers、 window)とのNode.js、globalあなたがしたい変数があるが。また、関数本体などのローカルスコープでも機能します。
トマーシュZato -復活モニカ

とにかくconstこの方法を使用して定義する方法はありますか?
toing_toing

165

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()


3
うん、ウィンドウを使用するよりも、これを使用します(いくつかの注意事項があります)
開始

12
なぜ1つのeval()回答が削除に反対票を投じられ、これが反対票を投じられたのですか
BoltClock

4
@goggin引数を正規表現テストして、有効な名前であることを確認する必要があります。最初にチェックせずに引数を無視するだけでは、途方もなく安全ではありません。
サイムVIDAS

16
これが質問に対する唯一の現実的な答えです。「eeeeevil」evalが含まれているからといって、それが真実であるとは言えません。JavaScriptには変数変数(phpの$$ varnameなど)がないため、これが本当に唯一の答えです。使用window[varname]すると、望ましくない可能性があるグローバル変数が導入されるという副作用があります。@Shaz現代のJS通訳に十分な信用を与えているとは思いません。それらは非常に高速で、1ミリ秒のタイマーやタイトループで実行されていない限り、単純な1行の割り当て操作を解析して実行しても、CPU使用率が急上昇することはありません。
MooGoo

2
@TheParamagneticCroissantコードのケアに熱心な人。時間とお金だけを大切にする人はそうではありません。
神保

41

eval対グローバル変数ソリューションに関する限り...

それぞれに利点があると思いますが、これは実際には誤った二分法です。グローバルな名前空間に偏執している場合は、一時的な名前空間を作成して、同じ手法を使用してください。

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

tempNamespace[myString] = 5;

次に、ストレージにウィンドウを使用せずに、tempNamespace.myVarProperty(現在は5)としてアクセスできることを確認してください。(文字列は括弧内に直接置くこともできます)


コードを少しリファクタリングして、同じインラインvar tempNamespace = {["myVarProperty"]: "Definitely only video"};を作成します。
Tioma

1
これは非常に優れた解決策です。絶対に必要な場合を除いて、eval()は回避すべきであると思われます。
skwidbreth 2017

コレクションdocument.body.getElementsByTagName( '*')から始めて、 'id'属性を持つすべての要素を見つけて、グローバルオブジェクト 'id'のそれぞれの要素オブジェクト値の変数を作成するのは簡単です。次に、JavaScriptで<div id = container>を「id.container」として参照できます。とても簡単!
デビッドスペクター

15
var myString = "echoHello";

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

echoHello();

邪悪な評価にはノーと言ってください。ここの例:https : //jsfiddle.net/Shaz/WmA8t/


3
これをローカルスコープで機能させると、反対票が削除されます。
トマーシュZato -復活モニカ

TomášZato@function aScope() { this[myString] = function() { alert("Hello!"); };};
RRW

@richmondwang thisは、ローカルスコープではなく、呼び出し中に関数がバインドされるオブジェクトを参照します。
トマーシュZato -復活モニカ

8

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

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

8

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

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

6

オブジェクトのプロパティにアクセスしようとしている場合は、目的の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]];

これは、オブジェクトのプロパティの深さに関係なく、オブジェクトのプロパティを取得するために機能します。


あなたの例はクールです。name変数名として使用すると、例は失敗しますが、他の変数名では機能します。これは、すでにname変数を持っているWindowオブジェクトに関係している可能性があります。また、.valueメソッドを含めると失敗しました。深くネストされたオブジェクト変数を解釈する機能は私が探しているものであり、あなたの方法は良い方向を示しています。ありがとう。
2016

問題ない。答えは、コピー/貼り付けの答えではなく、概念を実証するためのものです(ここでのほとんどの答えはそうだと思います)

1
SO応答は、修正するよりも改善に時間を費やすことができる場合に、さらに優れています。;-)
Theo

機能しません:Uncaught TypeError: Cannot read property 'split' of undefined
Roberto14 '26


0

このようにできます

(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

次のコードを使用すると、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

もっとはっきりさせましょう

function changeStringToVariable(variable, value){
window[variable]=value
}
changeStringToVariable("name", "john doe");
console.log(name);
//this outputs: john doe
let file="newFile";
changeStringToVariable(file, "text file");
console.log(newFile);
//this outputs: text file

1
Stack Overflowへようこそ!このコードは問題を解決する可能性がありますが、これが問題を解決する方法と理由の説明含めると、投稿の品質が向上し、おそらく投票数が増えることになります。あなたが今尋ねている人だけでなく、あなたが将来の読者のための質問に答えていることを忘れないでください。回答を編集して説明を追加し、適用される制限と前提を示してください。
ダニイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.