जावास्क्रिप्ट में स्ट्रिंग का नाम परिवर्तित करें


260

मैंने समाधान की तलाश की है, लेकिन वह कोई काम नहीं कर पाया।

मेरे पास एक चर है onlyVideo

"onlyVideo"स्ट्रिंग एक फंक्शन में पास हो जाती है। मैं onlyVideoफ़ंक्शन के अंदर चर को कुछ के रूप में सेट करना चाहता हूं । मैं उसे कैसे कर सकता हूँ?

(कई प्रकार के चर हैं जिन्हें फ़ंक्शन में बुलाया जा सकता है, इसलिए मुझे इसे गतिशील रूप से काम करने की आवश्यकता है, न कि कठोर कोडित ifबयान।)

संपादित करें: आप जो करने का प्रयास कर रहे हैं, उसका शायद एक बेहतर तरीका है। मैंने अपने जावास्क्रिप्ट एडवेंचर में इस पर जल्दी पूछा। चेक करें कि जावास्क्रिप्ट ऑब्जेक्ट कैसे काम करते हैं।

एक साधारण परिचय:

// 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
आप इसके लिए क्या उपयोग कर रहे हैं? क्या आप वास्तव में इसे सामान्य स्थानीय चर में सेट करना चाहते हैं, और एक ऑब्जेक्ट (हैश) काम नहीं करेगा?
डॉगबर्ट

mmm ... मैं अभी भी बहुत समझ नहीं पाता कि आप एरे के साथ दुनिया में ऐसा क्यों करना चाहते हैं। वैसे भी, आपके कुछ कोड और स्पष्टीकरण से बहुत मदद मिलेगी।
केविन चावेज़

मुझे लगता है कि आपके अंतिम लक्ष्य के बारे में हमें और विस्तार की आवश्यकता है
mcgrailm

जवाबों:


280

यदि यह एक वैश्विक चर है तो window[variableName] या आपके मामले window["onlyVideo"]में चाल चलनी चाहिए।


35
यहां तक ​​कि अगर वैश्विक नहीं है, तो आप इसे इस तरह से scope[property]या यहां तक कि एक्सेस कर सकते हैंthis[property]
वोज्शिएक बेदर्नस्की

7
@WojciechBednarski: गुंजाइश और संदर्भ को भ्रमित न करें। thisसंदर्भ है, यह इस बात पर निर्भर करता है कि फ़ंक्शन कैसे कहा जाता है। जेएस में, 50% समय तब तक thisहोता है windowजब तक आप सख्त मोड को सक्षम नहीं करते हैं और thisबन जाता है undefinedऔर एक त्रुटि फेंक देगा। स्कोप कुछ पूरी तरह से अलग है और यह एक वस्तु नहीं है (वैश्विक गुंजाइश को छोड़कर जो कि windowवस्तु द्वारा प्रतिबिंबित होती है )
स्लीबेटमैन

3
में काम नहीं करता है WebWorkers(जहां selfवैश्विक दायरे में सुधार होता है, जैसा कि यह ब्राउज़र में होता है, जहां यह समान है window) और Node.js, globalवह चर है जहां आप चाहते हैं। और यह नए स्कैप्स के साथ काम करता है, जैसे कि फंक्शन बॉडी।
टॉम ज़ातो -

वहाँ वैसे भी constइस पद्धति का उपयोग कर परिभाषित करने के लिए है?
toing_toing

165

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
एक eval()उत्तर को हटाए जाने का जवाब क्यों दिया गया था , और इस एक को हटा दिया गया ?
BoltClock

4
@goggin आपको यह सुनिश्चित करने के लिए तर्क का परीक्षण करना चाहिए कि यह एक मान्य नाम है। केवल पहले जांच किए बिना तर्क को विकसित करना हास्यास्पद रूप से असुरक्षित है।
54इमे विदेस

16
यह प्रश्न का एकमात्र यथार्थवादी उत्तर है। सिर्फ इसलिए कि इसमें "ईवीविल" शामिल था, यह किसी भी कम सच नहीं है। जावास्क्रिप्ट में वैरिएबल चर (जैसे $ php में varname) नहीं है, इसलिए यह वास्तव में एकमात्र उत्तर है। उपयोग window[varname]करने से वैश्विक चर पेश करने का साइड-इफेक्ट होता है, जो संभव नहीं है। @ शाज मुझे नहीं लगता कि आप आधुनिक जेएस दुभाषियों को पर्याप्त क्रेडिट देते हैं। वे बहुत तेज़ हैं, और एक सरल एक पंक्ति असाइनमेंट ऑपरेशन को पार्स करना और निष्पादित करना किसी के सीपीयू उपयोग को फैलाने वाला नहीं है जब तक कि यह 1ms टाइमर या तंग लूप में नहीं किया जा रहा है।
मूगू 19

2
@TheParamagneticCroissant जो लोग कोड देखभाल के बारे में भावुक हैं। जो केवल समय और धन को महत्व देते हैं।
जिम्बो

41

जहाँ तक eval बनाम वैरिएबल वैरिएबल सॉल्यूशंस ...

मुझे लगता है कि प्रत्येक के लिए फायदे हैं लेकिन यह वास्तव में एक गलत द्वैध है। यदि आप वैश्विक नाम स्थान से पागल हैं तो बस एक अस्थायी नाम स्थान बनाएं और उसी तकनीक का उपयोग करें।

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

tempNamespace[myString] = 5;

बहुत यकीन है कि तब आप tempNamespace.myVarProperty (अब 5) के रूप में उपयोग कर सकते हैं, भंडारण के लिए विंडो का उपयोग करने से बचें। (स्ट्रिंग को सीधे ब्रैकेट में भी डाला जा सकता है)


एक ही इनलाइन var tempNamespace = {[["myVarProperty"]: "निश्चित रूप से केवल वीडियो"} बनाने के लिए आपका कोड थोड़ा सा रिफ्लेक्टर;
तियोमा

1
यह एक बहुत अच्छा समाधान है - ऐसा लगता है कि eval () से बचा जाना चाहिए जब तक कि बिल्कुल आवश्यक न हो, यहां बहुत ही सुरुचिपूर्ण वर्कअराउंड है।
17

संग्रह दस्तावेज़ के साथ शुरू करना। तब आप जावास्क्रिप्ट में <div id = container> को 'id.container' के रूप में संदर्भित कर सकते हैं। इतना आसान!
डेविड स्पैक्टर

15
var myString = "echoHello";

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

echoHello();

बुराई को बुराई नहीं कहेंगे । यहाँ उदाहरण: https://jsfiddle.net/Shaz/WmA8t/


3
यह काम स्थानीय दायरे में करें और मैं मंदी को दूर करूंगा।
टॉम ज़ातो -

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

@richmondwang thisस्थानीय दायरे के लिए नहीं बल्कि उस वस्तु से संबंधित है जिसे फ़ंक्शन कॉल के दौरान बाध्य करता है।
टॉम ज़ातो -

8

आप विंडो ऑब्जेक्ट को एक सहयोगी सरणी के रूप में एक्सेस कर सकते हैं और इसे इस तरह सेट कर सकते हैं

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

8

विंडो ['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चर पहले से ही विंडो ऑब्जेक्ट के साथ करना पड़ सकता है । इसके अलावा, .valueविधि सहित विफलता का कारण बना। गहरी नेस्टेड ऑब्जेक्ट चर की व्याख्या करने की क्षमता वह है जो मैं खोज रहा हूं और आपकी विधि एक अच्छी दिशा को इंगित करती है। धन्यवाद।
थियो

कोई दिक्कत नहीं है। उत्तर कापी / पेस्ट उत्तर होने के बजाय अवधारणा को प्रदर्शित करने के लिए अधिक है (जैसा कि एसओ मुझे लगता है कि यहां अधिकांश उत्तर हैं)

1
SO प्रतिक्रियाएं तब और बेहतर होती हैं जब आप उन्हें ठीक करने के बजाय उन्हें सुधारने में समय बिता सकते हैं। ;-)
थियो

काम नहीं करता है:Uncaught TypeError: Cannot read property 'split' of undefined
रॉबर्टो 14


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

निम्न कोड जावास्क्रिप्ट में आपके प्रत्येक DIV और अन्य HTML तत्वों को संदर्भित करना आसान बनाता है। इस कोड को टैग से ठीक पहले शामिल किया जाना चाहिए, ताकि सभी HTML तत्व देखे जा सकें। इसका पालन आपके जावास्क्रिप्ट कोड द्वारा किया जाना चाहिए।

// 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";
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.