JavaScript'te dizeyi değişken adına dönüştürme


260

Çözüm aradım, ama işe yarayan bir şey bulamadım.

Adlı bir değişkenim var onlyVideo.

"onlyVideo"dize bir işleve geçirilir. onlyVideoİşlev içindeki değişkeni bir şey olarak ayarlamak istiyorum . Bunu nasıl yapabilirim?

(İşlev içine çağrılabilir değişkenlerin bir dizi vardır, bu yüzden sabit kodlu ififadeler değil, dinamik olarak çalışması gerekir .)

Düzenleme: Yapmaya çalıştığınız şeyi yapmanın daha iyi bir yolu olabilir. Bunu JavaScript maceranın başlarında sordum. JavaScript nesnelerinin nasıl çalıştığını kontrol edin.

Basit bir giriş:

// 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
Bunu ne için kullanıyorsun? Normal bir yerel değişkene ayarlamanız gerektiğinden kesinlikle emin misiniz ve bir Nesne (Karma) çalışmaz mı?
Dogbert

mmm ... Bunu dizileri olan bir dünyada neden yapmak istediğini hâlâ anlamıyorum. Her neyse, bazı kodlarınız ve açıklamalarınız çok yardımcı olacaktır.
Kevin Chavez

nihai hedefin ne olduğu hakkında daha fazla ayrıntıya ihtiyacımız olduğunu düşünüyorum
mcgrailm

Yanıtlar:


281

Küresel bir değişkense, o zaman window[variableName] ya da sizin durumunuzda window["onlyVideo"]hile yapmalısınız.


35
Küresel olmasa bile, bu şekilde scope[property]veya hatta böyle erişebilirsinizthis[property]
Wojciech Bednarski

7
@WojciechBednarski: Kapsamı ve bağlamı karıştırmayın. thisbağlam, işaret ettiği şey işlevin nasıl çağrıldığına bağlıdır. JS yılında zamanın% 50 thisolan windowkatı mod etkinleştirmek ve sürece thisolur undefinedve bir hata verir. Kapsam tamamen farklı bir şeydir ve bir nesne değildir (nesne tarafından yansıtılan küresel kapsam hariç window)
slebetman

3
Değil çalışıyor mu WebWorkers(burada selfreffers küresel kapsamına, bu eşit olduğunu tarayıcısında yaptığı gibi window) ve node.js, nereye globalistediğiniz değişkendir. Ve daha yeni, işlev gövdesi gibi yerel kapsamlarla çalışır.
Tomáš Zato - Monica'yı eski durumuna getir

constBu yöntemi kullanarak tanımlamak için yine de var mı?
toing_toing

165

Javascript'in bu eval()gibi durumlar için bir işlevi vardır :

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

Edit: Üzgünüm, sanırım soru çok çabuk yağsız. Bu size sadece değişkeni getirir, ihtiyacınız olanı ayarlamak için

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

veya bir dize kullanıyorsanız:

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

Ama aradığınızı başarmanın daha uygun bir yolu olduğunu hayal ediyorum? Eval () 'in büyük bir nedeni olmadıkça gerçekten kullanmak istediğiniz bir şey olduğunu düşünmüyorum. Eval ()


3
Evet ben pencere yerine (bazı uyarılar vardır) kullanarak bu gitmek istiyorum
ingo

12
Bir eval()cevap neden silinmeye ve bu cevap kaldırıldı?
BoltClock

4
@goggin Geçerli bir ad olduğundan emin olmak için bağımsız değişkeni yeniden test etmelisiniz. Sadece argümanı kontrol etmeden değerlendirmek gülünç güvensizdir.
Šime Vidas

16
Bu sorunun tek gerçekçi cevabı. Sadece "eeeeevil" eval içermesi onu daha az doğru yapmaz. Javascript değişken değişkenlere sahip değildir (php'de $$ varname gibi) bu yüzden tek cevap budur. Kullanmanın window[varname], istenmeyebilecek küresel değişkenleri tanıtmanın yan etkisi vardır. @Shaz Modern JS tercümanlarına yeterince kredi verdiğinizi sanmıyorum. Son derece hızlıdırlar ve basit bir tek satırlık atama işleminin ayrıştırılması ve yürütülmesi, 1 ms'lik bir zamanlayıcıda veya sıkı döngüde yapılmadığı sürece kimsenin CPU kullanımını artırmayacaktır.
MooGoo

2
@TheParamagneticCroissant Kod bakımı konusunda tutkulu insanlar. Sadece zaman ve paraya değer verenler buna değer vermezler.
Jimbo

41

Eval ve global değişken çözümlere göre ...

Her birinin avantajları olduğunu düşünüyorum ama bu gerçekten yanlış bir ikilik. Global ad alanının paranoyası varsa, sadece geçici bir ad alanı oluşturun ve aynı tekniği kullanın.

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

tempNamespace[myString] = 5;

Depolama için pencereyi kullanmaktan kaçınarak tempNamespace.myVarProperty (şimdi 5) olarak erişebileceğinizden eminim. (Dize doğrudan parantez içine de konabilir)


Biraz aynı satır içi var yapmak için kodunuzu yeniden düzenleyin var tempNamespace = {["myVarProperty"]: "Kesinlikle sadece video"};
Tioma

1
Bu çok iyi bir çözümdür - eval () kesinlikle gerekli olmadıkça, çok zarif bir çözüm burada kaçınılmış gibi görünüyor.
skwidbreth

Toplama belgesi.body.getElementsByTagName ('*') ile başlayarak, bir 'id' özniteliğine sahip tüm öğeleri bulmak ve global bir 'id' nesnesindeki her birinin öğe nesnesi değeri için bir değişken oluşturmak kolaydır. Daha sonra JavaScript'te <div id = container> 'id.container' olarak başvurabilirsiniz. Çok kolay!
David Spector

15
var myString = "echoHello";

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

echoHello();

Kötü değerlendirmeye hayır de . Burada örnek: https://jsfiddle.net/Shaz/WmA8t/


3
Bu işlemi yerel kapsamda yapın ve ben aşağı oyu kaldıracağım.
Tomáš Zato - Monica'yı eski durumuna getir

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

@richmondwang thisyerel kapsama değil, çağrı sırasında işlevin bağlı olduğu nesneye referanstır.
Tomáš Zato - Monica'yı geri yükle

8

Pencere nesnesine ilişkilendirilebilir bir dizi olarak erişebilir ve bu şekilde ayarlayabilirsiniz

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

8

Window ['variableName'] yöntemi SADECE değişken global kapsamda tanımlanmışsa çalışır. Doğru cevap "Refactor". Bir "Nesne" bağlamı sağlayabilirseniz, olası bir genel çözüm vardır, ancak değişkenin kapsamına bağlı olarak hiçbir genel işlevin çözemeyeceği bazı değişkenler vardır.

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

6

Bir nesnenin özelliğine erişmeye çalışıyorsanız, istediğiniz windownesneye ulaşıncaya kadar nesnenin kapsamıyla başlamalı ve nesnenin her bir özelliğinden geçmelisiniz. Kodda a.b.cbaşka bir yerde tanımlandığını varsayarsak , aşağıdakileri kullanabilirsiniz:

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

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

Bu, ne kadar derin olursa olsun, herhangi bir nesnenin mülkiyetini elde etmek için işe yarayacaktır.


Örneğin güzel. nameDeğişken adı olarak kullanırsam örneğiniz başarısız olur, ancak diğer değişken adlarıyla çalışır. Bunun zaten bir namedeğişkene sahip olan Window nesnesiyle ilgili olması gerekebilir . Ayrıca, .valueyöntem dahil başarısızlık neden oldu. Derin iç içe geçmiş nesne değişkenlerini yorumlama yeteneği aradığım şeydir ve yönteminiz iyi bir yönü gösterir. Teşekkürler.
Theo

Sorun değil. Cevap, bir kopyala / yapıştır cevabı olmaktan ziyade kavramı göstermek için daha fazladır (burada en çok cevap SO gibi düşünüyorum)

1
SO yanıtları, düzeltmek yerine onları geliştirmek için zaman harcayabildiğinizde daha da iyidir. ;-)
Theo

Uncaught TypeError: Cannot read property 'split' of undefined
Çalışmıyor


0

Bu şekilde yapılabilir

(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

Aşağıdaki kod, DIV'lerinizin her birine ve JavaScript'teki diğer HTML öğelerine başvurmanızı kolaylaştırır. Tüm HTML öğelerinin görülmesi için bu kod etiketten hemen önce eklenmelidir. Bunu JavaScript kodunuz izlemelidir.

// 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";

-1

daha net yapmama izin ver

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'a hoş geldiniz! Bu kod soruyu çözebilir, ancak bunun sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olabilir ve muhtemelen daha fazla oyla sonuçlanır. Sadece şimdi soran kişi için değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın. Lütfen açıklama eklemek için yanıtınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin.
Daniil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.