জাভাস্ক্রিপ্টের স্ট্রিংকে পরিবর্তনশীল নামে রূপান্তর করুন


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
আপনি এটি কি জন্য ব্যবহার করছেন? আপনি কি একেবারে নিশ্চিত যে আপনার এটি একটি সাধারণ স্থানীয় পরিবর্তনশীল হিসাবে সেট করা দরকার, এবং একটি অবজেক্ট (হ্যাশ) কাজ করবে না?
ডগবার্ট

মিমি ... আপনি অ্যারে যুক্ত বিশ্বে কেন এটি করতে চান তা আমি এখনও বুঝতে পারি না। যাইহোক, আপনার কিছু কোড এবং ব্যাখ্যা অনেক সাহায্য করবে।
কেভিন চাভেজ

আমি মনে করি আপনার চূড়ান্ত লক্ষ্যটি কী তা সম্পর্কে আমাদের আরও বিশদ প্রয়োজন
এমকগ্রিল্ম

উত্তর:


280

যদি এটি বিশ্বব্যাপী পরিবর্তনশীল হয় window[variableName] বা আপনার ক্ষেত্রে window["onlyVideo"]কৌশলটি করা উচিত।


35
এমনকি বিশ্বব্যাপী না হলেও, আপনি এটির মাধ্যমে scope[property]বা এমনকি this[property]
এটিতেও

7
@ ওয়াজসিচ বেদনারস্কি: সুযোগ এবং প্রসঙ্গটি বিভ্রান্ত করবেন না। thisপ্রসঙ্গ, এটি কীভাবে নির্দেশ করে তা কীভাবে ফাংশন বলা হয় তার উপর নির্ভর করে। জেএসে, 50% সময় thisহ'ল windowযদি আপনি কঠোর মোড সক্ষম না করেন এবং thisপরিণত হন undefinedএবং ত্রুটি নিক্ষেপ করেন। ব্যাপ্তি পুরোপুরি আলাদা কিছু এবং এটি কোনও বস্তু নয় (বৈশ্বিক সুযোগ ব্যতীত যা windowবস্তু দ্বারা মিরর করা হয় )
স্লাইবেটম্যান

3
WebWorkers(যেখানে selfএটি ব্রাউজারে যেমন হয়, ঠিক তেমন যেখানে এটি সমান হয় window) এবং নোড.জেএস, যেখানে globalআপনি যে পরিবর্তনশীলটি চান তা তেমন কাজ করে না (যেখানে বিশ্বব্যাপী স্কোপ থেকে রেফার হয় । এবং এটি স্থানীয় স্কোপগুলি যেমন ফাংশন বডি সহ নতুন কাজ করে।
টোমা জ্যাটো - মনিকা

constএই পদ্ধতিটি ব্যবহার করে কোনও সংজ্ঞা দেওয়া যায় কি ?
টোইনিং_টোয়িং

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 + "'");
}

তবে আমি ভাবছি আপনি যা খুঁজছেন তা সম্পাদনের জন্য আরও উপযুক্ত উপায় আছে? আমি মনে করি না evভাল () এমন কিছু যা আপনি সত্যিকার অর্থে ব্যবহার করতে চান যদি না এর কারণ হয়। Eval ()


3
হাঁ আমি এই উইন্ডোটি বরং তারপর ব্যবহার (এটা কিছু আদেশ সহকারে আছে) সঙ্গে যেতে হবে
ইঙ্গো

12
কেন একটি eval()উত্তর মুছে ফেলা হয়েছে, এবং এই উত্তর অগ্রাহ্য করা হয়েছিল ?
বোল্টক্লক

4
@goggin আপনার বৈধ নামটি নিশ্চিত করার জন্য আপনার যুক্তিটি পুনরায় পরীক্ষা করা উচিত। প্রথমে এটি পরীক্ষা না করে যুক্তিটি ব্যাখ্যা করা হাস্যকরভাবে সুরক্ষিত।
Vidime বিদাস

16
এই প্রশ্নের একমাত্র বাস্তব উত্তর। এটি "আইভিল" ইওলকে জড়িত করার কারণে এটি কোনও কম সত্য করে তোলে না। জাভাস্ক্রিপ্টের পরিবর্তনশীল ভেরিয়েবলগুলি নেই (যেমন পিএইচপি-তে $$ বর্ণনাম) তাই এটি সত্যই একমাত্র উত্তর। ব্যবহারের window[varname]বৈশ্বিক ভেরিয়েবলগুলি প্রবর্তনের পার্শ্ব-প্রতিক্রিয়া রয়েছে, যা সম্ভবত প্রয়োজন ছিল না। @ শ্যাজ আমি মনে করি না আপনি আধুনিক জেএস দোভাষীকে পর্যাপ্ত ক্রেডিট দেন। তারা অত্যন্ত দ্রুত, এবং পার্সিং এবং একটি সাধারণ এক লাইন অ্যাসাইনমেন্ট ক্রিয়াকলাপ কার্যকর করা যতক্ষণ না এটি 1 এমএস টাইমার বা টাইট লুপে করা হচ্ছে না ততক্ষণ কারও সিপিইউ ব্যবহার স্পাইক করবে না।
MooGoo

2
@ দ্য পারম্যাগনেটিক ক্রোস্যান্ট লোক যারা কোড কেয়ার সম্পর্কে আগ্রহী। যারা কেবল সময় এবং অর্থকে মূল্য দেয় না।
জিম্বো

41

যতদূর ইওমাল বনাম গ্লোবাল ভেরিয়েবল সমাধানগুলি ...

আমি মনে করি প্রত্যেকটির সুবিধাগুলি রয়েছে তবে এটি সত্যই একটি মিথ্যা দ্বিবিজ্ঞান। আপনি যদি বিশ্বব্যাপী নেমস্পেস সম্পর্কে অসম্পূর্ণ হন তবে কেবল একটি অস্থায়ী নেমস্পেস তৈরি করুন এবং একই কৌশলটি ব্যবহার করুন।

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

tempNamespace[myString] = 5;

খুব নিশ্চিত যে আপনি স্টোরের জন্য উইন্ডো ব্যবহার করা এড়িয়ে টেম্পনেমস্পেস.মাইভিপ্রোপার্টি (এখন 5) হিসাবে অ্যাক্সেস করতে পারবেন। (স্ট্রিংটি সরাসরি বন্ধনীগুলিতেও লাগানো যেতে পারে)


আপনার কোডটি একই ইনলাইন ভার টেমনেসস্পেস = {["মাইভারপোপার্টি"] তৈরি করতে কিছুটা রিফ্যাক্টর: "অবশ্যই কেবলমাত্র ভিডিও"};
টিওমা

1
এটি একটি খুব ভাল সমাধান - এটি মনে হয় এভাল () এড়ানো একেবারেই প্রয়োজনীয়, খুব মার্জিত কাজ ব্যতীত এড়ানো উচিত here
skwidbreth

সংগ্রহটি ডকুমেন্ট.বিডি.এলিটমেন্টস বাই টাইগনাম ('*') দিয়ে শুরু করে একটি 'আইডি' বৈশিষ্ট্যযুক্ত সমস্ত উপাদান খুঁজে পাওয়া এবং গ্লোবাল অবজেক্ট 'আইডি'র প্রত্যেকটির উপাদান উপাদানটির জন্য একটি ভেরিয়েবল তৈরি করা সহজ। তারপরে আপনি জাভাস্ক্রিপ্টে <ডিডি আইডি = ধারক> কে 'আইডি কোডটেনার' হিসাবে উল্লেখ করতে পারেন। খুব সহজ!
ডেভিড স্পেক্টর

15
var myString = "echoHello";

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

echoHello();

কোন বলুন মন্দ Eval। উদাহরণ এখানে: https://jsfiddle.net/Shaz/WmA8t/


3
স্থানীয় স্কোপটিতে এই কাজটি করুন এবং আমি ডাউনটাওট সরিয়ে ফেলব।
টোমা জ্যাটো - মনিকা

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

@ thisরিচমন্ডওয়াং স্থানীয় ক্ষেত্রের জন্য নয় বরং কল করার সময় এই ক্রিয়াকলাপটির সাথে আবদ্ধ যে বিষয়টির প্রতি শ্রদ্ধা।
টোম জাটো - মনিকা

8

আপনি উইন্ডো অবজেক্টটিকে একটি সহযোগী অ্যারে হিসাবে অ্যাক্সেস করতে এবং সেভাবে সেট করতে পারেন

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

8

উইন্ডো ['ভেরিয়েবলনেম'] পদ্ধতিটি কেবলমাত্র কার্যকর হয় যদি ভেরিয়েবলটি বিশ্ব স্কোপে সংজ্ঞায়িত করা হয়। সঠিক উত্তরটি হ'ল "রিফ্যাক্টর"। আপনি যদি কোনও "অবজেক্ট" প্রসঙ্গ সরবরাহ করতে পারেন তবে একটি সম্ভাব্য সাধারণ সমাধান বিদ্যমান, তবে কিছু ভেরিয়েবল রয়েছে যা ভেরিয়েবলের স্কোপের ভিত্তিতে কোনও বৈশ্বিক ফাংশন সমাধান করতে পারে না।

(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
আপনার প্রতিক্রিয়াগুলি আরও ভাল হয় যখন আপনি সেগুলি ঠিক করার চেয়ে তাদের উন্নতি করতে সময় ব্যয় করতে পারেন। ;-)
থিও

কাজ করে না: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

নিম্নলিখিত কোডটি জাভাস্ক্রিপ্টে আপনার প্রতিটি ডিআইভি এবং অন্যান্য এইচটিএমএল উপাদানকে উল্লেখ করা সহজ করে তোলে। এই কোডটি ট্যাগের ঠিক আগে অন্তর্ভুক্ত করা উচিত, যাতে সমস্ত 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";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.