জাভাস্ক্রিপ্টে গতিশীল পরিবর্তনশীল নাম ব্যবহার করুন


344

পিএইচপি-তে আপনি আশ্চর্যজনক / ভয়ঙ্কর জিনিসগুলি করতে পারেন:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1

জাভাস্ক্রিপ্ট দিয়ে এই জাতীয় কিছু করার কোনও উপায় আছে কি?

উদাহরণস্বরূপ আমার যদি একটি থাকে তবে আমি var name = 'the name of the variable';নামের সাথে ভেরিয়েবলের একটি রেফারেন্স পেতে পারি name?


2
স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 24২৪77//২ , এবং স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১6464৪৪২২/২ এর সম্ভাব্য দ্বিগুণ , তবে গ্রহণযোগ্য উত্তরটি এখানে আরও ভাল, আইএমও।
গুদেডে

এটা কি তোমার প্রশ্নের উত্তর? জাভাস্ক্রিপ্টে "চলক" পরিবর্তনশীল? । এখানে গৃহীত উত্তরগুলির চেয়ে উত্তম উত্তর কারণ এটি এটি কীভাবে করা যায় তা দেখায়, তবে সঠিকভাবে সতর্ক করে দেয় যে আপনি যা করতে চান তা করার প্রায় সবসময়ই একটি ভাল উপায়মেটাতে এক্সওয়াই সমস্যা দেখুন ।
ggorlen

উত্তর:


353

ECMA- / জাভাস্ক্রিপ্ট যেহেতু সব কিছু Objectsএবং Contexts(যা কিছুটা অবজেক্টেরও), তাই প্রতিটি ভেরিয়েবল যেমন ভেরিয়েবল- (বা কোনও ফাংশন, অ্যাক্টিভেশন অবজেক্টের ক্ষেত্রে সংরক্ষণ করা হয়) ) সংরক্ষণ করা হয়।

সুতরাং আপনি যদি এর মতো ভেরিয়েবল তৈরি করেন:

var a = 1,
    b = 2,
    c = 3;

ইন গ্লোবাল স্কোপ (= কোন ফাংশন প্রসঙ্গ), আপনি পরোক্ষভাবে মধ্যে যারা ভেরিয়েবল লিখতে গ্লোবাল অবজেক্ট (= windowএকটি ব্রাউজারে)।

এগুলি "ডট" বা "বন্ধনী" স্বরলিপি ব্যবহার করে অ্যাক্সেস পেতে পারে:

var name = window.a;

অথবা

var name = window['a'];

এটি কেবলমাত্র, এই বিশেষ উদাহরণস্বরূপ বৈশ্বিক বস্তুর জন্য কাজ করে কারণ চলক অবজেক্ট এর গ্লোবাল অবজেক্ট হয় windowবস্তুর নিজেই। কোনও ফাংশনের প্রসঙ্গে, আপনার কাছে সরাসরি প্রবেশাধিকার নেই অ্যাক্টিভেশন অবজেক্টটিতে । এই ক্ষেত্রে:

function foobar() {
   this.a = 1;
   this.b = 2;

   var name = window['a']; // === undefined
   alert(name);
   name = this['a']; // === 1
   alert(name);
}

new foobar();

newএকটি স্ব-সংজ্ঞায়িত বস্তুর (প্রসঙ্গ) নতুন ইভেন্ট তৈরি করে context newফাংশন সুযোগ ছাড়াই এছাড়াও হবে global(= উইন্ডো)। এই উদাহরণ সতর্কতা undefinedএবং 1যথাক্রমে হবে। যদি আমরা এর সাথে প্রতিস্থাপন করতাম this.a = 1; this.b = 2:

var a = 1,
    b = 2;

উভয় সতর্কতা আউটপুট অপরিজ্ঞাত করা হবে। সেই দৃশ্যে, ভেরিয়েবলগুলি aএবং bঅ্যাক্টিভেশন অবজেক্ট থেকে সংরক্ষণ করা হবে foobar, যা আমরা অ্যাক্সেস করতে পারি না (অবশ্যই আমরা সরাসরি কল করে aএবং সেগুলি অ্যাক্সেস করতে পারি b)।


1
আর একটি দুর্দান্ত জিনিস হ'ল এইভাবে আপনি যে কোনও বিশ্বস্তরের ফাংশনের জন্য কলব্যাক (শুরু / শেষ) যুক্ত করতে পারেন।
অ্যান্টিটক্সিক

5
তবে যদি আমার গতিশীল পরিবর্তনশীল কোনও ফাংশনে স্থানীয় হয়? উদাহরণস্বরূপ: ফাংশন বোইঙ্ক () {var a = 1; // এটি var ডায়নামিকটি কাজ করবে না = এটি ['এ']; // this will wont work var ডায়নামিক = ['a']; }
কোকোডোকো

@ Kokodoko কারণ এই "প্রসঙ্গ" অথবা একটি ফাংশনের ফাঁসি প্রসঙ্গ একটি রেফারেন্স নয় (সেখানে একটা ফাঁসি প্রসঙ্গ রেফারেন্স কোন উপায় নেই, এটা ECMA-262 দ্বারা নিষিদ্ধ করা হয়েছে)। এটি কোনও ফাংশনকে কীভাবে বলা হয় (বা বাঁধাই করে ) সেট করা হয় , এটি কেবলমাত্র একটি অবজেক্ট যার সাথে এটি অ্যাক্সেসযোগ্য সম্পাদনের প্রসঙ্গে do
রবজি

আপনার যদি নেস্টেড বৈশিষ্ট্যগুলি অ্যাক্সেস করার প্রয়োজন হয় তবে stackoverflow.com/questions/4244896/… দেখুন
মিঃ বিআর

বন্ধনী স্বরলিপি সহ আমাকে সঠিক দিকে ইশারা করলেন। শুধুমাত্র ডট স্বরলিপি চিন্তা আটকে ছিল।
অ্যান্ড্রু

149

eval একটি বিকল্প।

var a = 1;
var name = 'a';

document.write(eval(name)); // 1

19
না এটি খারাপ হিসাবে খারাপ হিসাবে দেখা উচিত নয়। কখনও ব্যবহার করুন!
ইজিবিবি

52
@ এসিসিবিবি - আপনি যদি কখনও কিছু ব্যবহার করবেন না বলে বলতে যাচ্ছেন, তবে কেন তা ব্যাখ্যা করতে আমি সহায়ক না। আমার এমন একটি পরিস্থিতি রয়েছে যেখানে আমি ইভাল () ব্যতীত আমি যা করছি তা সম্পাদন করার কোনও অন্য উপায়ের কথা ভাবতে পারি না
র‌্যাম্প্যান্ট ক্রিয়েটিভ গ্রুপ

4
ইভাল শেষ ব্যবহারকারীদের উপর আক্রমণ করার ঝুঁকি তৈরি করে এবং আমরা এটি প্রযুক্তিগতভাবে খারাপ নয় বরং হারিয়ে যাওয়া মামলায় ভুল বোঝাবুঝি এবং অপব্যবহার করব। আমি পিএইচপি প্রতিক্রিয়া দেখেছি যা এতে আক্ষরিক ভার রয়েছে এবং এটি চালানোর জন্য ইওল ব্যবহার করে। যদিও আরও ভাল পদ্ধতি রয়েছে তাই এটি এই ক্ষেত্রে ব্যবহার করা উচিত নয়। সামগ্রিকভাবে আরও ভাল পদ্ধতি রয়েছে বলে এই প্রশ্নটি হাতে নেওয়া উচিত নয় এবং আমি নিশ্চিত আমাদের অনেকেরই এটি জানা আছে।
ইজিবিবি 13

2
এর মাধ্যমে javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval --- এর --- "আসুন ব্যবহারের বিরুদ্ধে প্রায়শই সমালোচিত যুক্তি বিবেচনা করা যাক: 1) এটি একটি সংকলন প্রয়োজন এবং অতএব ধীর হয় 2) যদি একটি হয় তবে বিদ্বেষপূর্ণ লিপিটি আপত্তিজনক তর্কের পক্ষে খুঁজে পেয়েছে? 3) এটি
কুরুচিপূর্ণ বলে

1
এখানে eval ব্যবহার করে ডায়নামিক ভেরিয়েবলগুলি কীভাবে তৈরি করবেন তা এখানে রয়েছে: stackoverflow.com/a/13291766/5528600
am2124429

80

আপনি এটি পেতে উইন্ডো অবজেক্টটি ব্যবহার করতে পারেন।

window['myVar']

window আপনি ব্যবহার করছেন সমস্ত বৈশ্বিক চলক এবং গ্লোবাল ফাংশনগুলির একটি রেফারেন্স রয়েছে।


28
এবং এটি বলা বাহুল্য, এটি একটি alভাল () এর চেয়ে নিরাপদ।
Cray

45

খারাপ উত্তর কী এত বেশি ভোট পায় তা কেবল জানেন না। এটি বেশ সহজ উত্তর তবে আপনি এটি জটিল করে তোলেন।

// If you want to get article_count
// var article_count = 1000;
var type = 'article';
this[type+'_count'] = 1000;  // in a function we use "this";
alert(article_count);

13
"একটি ফাংশনে আমরা ব্যবহার this" - আপনি একটি অ্যাক্সেস করতে চান তাহলে বিশ্বব্যাপী এই ভাবে পরিবর্তনশীল, এটা স্পষ্ট হতে হবে এবং ব্যবহার করা ভাল windowবস্তু, না thisthisঅস্পষ্ট।
মিঃ হোয়াইট

1
তবে কোনও ফাংশনের অভ্যন্তরে আপনি উদাহরণটি থেকে thisভেরিয়েবলটি অ্যাক্সেস করতে বা অন্য কিছু ব্যবহার করতে পারবেন না type, যদি আপনার অন্য ভেরিয়েবলের নাম থাকে: function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')দেখাবে article, তা নয় something else। এবং এটিই "জটিল উত্তর" ব্যাখ্যা করে।
ওরাফু

28
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);

এটা চেষ্টা কর...


27

এটি একটি উদাহরণ:

for(var i=0; i<=3; i++) {
    window['p'+i] = "hello " + i;
}

alert(p0); // hello 0
alert(p1); // hello 1
alert(p2); // hello 2
alert(p3); // hello 3

আরেকটি উদাহরণ :

var myVariable = 'coco';
window[myVariable] = 'riko';

alert(coco); // display : riko

সুতরাং, মান " কোকো এর" myVariable একটি পরিবর্তনশীল হয়ে কোকো

কারণ গ্লোবাল স্কোপে সমস্ত ভেরিয়েবল উইন্ডো অবজেক্টের বৈশিষ্ট্য।


14

জাভাস্ক্রিপ্টে আপনি এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন যে সমস্ত বৈশিষ্ট্যই মূল্যের মান। jAndy ইতিমধ্যে এটি উল্লেখ করেছে তবে আমি মনে করি না যে তার উত্তর কীভাবে এটি ব্যবহার করা যেতে পারে তা দেখায়।

সাধারণত আপনি একটি ভেরিয়েবলের নাম ধরে রাখতে একটি ভেরিয়েবল তৈরি করার চেষ্টা করছেন না তবে ভেরিয়েবলের নাম জেনারেট করার চেষ্টা করছেন এবং সেগুলি ব্যবহার করুন। পিএইচপি এটি $$varস্বরলিপি সহ করে তবে জাভাস্ক্রিপ্টের দরকার নেই কারণ সম্পত্তি কীগুলি অ্যারে কীগুলির সাথে বিনিময়যোগ্য।

var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);

123 দেয় Usually সাধারণত আপনি ভেরিয়েবলটি বানাতে চান যা কেন তাই ইন্ডিয়ারেশন থাকে তাই আপনি এটি অন্য উপায়েও করতে পারেন।

var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);

1
var someJsonObj = {}; একটি লুপে .... এর জন্য (var i = 0; i <= 3; i ++) {কিছু জেসনঅবজ [i] = []; }, তবে আমি কিছু হতে পারি। তাই গতিশীলভাবে উত্পন্ন ভেরিয়েবলগুলি, সকলেই সহজ রেফারেন্সের জন্য কিছু জসনঅবজের ভিতরে বসে।
রাজিভ

5

2019

টি এল; ডিআর

  • eval অপারেটর প্রস্থটিতে স্ট্রিং এক্সপ্রেশন চালাতে পারে এবং প্রসঙ্গটি থেকে ভেরিয়েবলগুলি ফিরিয়ে আনতে পারে;
  • literal objectতাত্ত্বিকভাবে লেখার মাধ্যমে এটি করতে পারে: {[varName]}তবে এটি সংজ্ঞা দ্বারা অবরুদ্ধ।

সুতরাং আমি এই প্রশ্নটি জুড়ে এসেছি এবং এখানকার প্রত্যেকেই আসল সমাধান না নিয়েই খেলেন। তবে @ অ্যাক্সেল হাইডারের একটি ভাল আগমন রয়েছে।

সমাধানটি হ'ল eval। প্রায় সবচেয়ে ভুলে যাওয়া অপারেটর (মনে হয় সর্বাধিক একwith() )

evalঅপারেটর এটি প্রসঙ্গে প্রেরণায় গতিময়ভাবে চালাতে পারে can এবং যে অভিব্যক্তি ফলাফল ফিরে। আমরা এটিকে ফাংশনের প্রসঙ্গে গতিশীলভাবে একটি ভেরিয়েবলের মান ফেরত দিতে ব্যবহার করতে পারি।

উদাহরণ:

function exmaple1(){
   var a = 1, b = 2, default = 3;
   var name = 'a';
   return eval(name)
}

example1() // return 1


function example2(option){
  var a = 1, b = 2, defaultValue = 3;

  switch(option){
    case 'a': name = 'a'; break;
    case 'b': name = 'b'; break;
    default: name = 'defaultValue';
  }
  return eval (name);
}

example2('a') // return 1
example2('b') // return 2
example2() // return 3

নোট করুন যে আমি সবসময় স্পষ্টভাবে লিখি এক্সপ্রেশনটি evalচলবে। কোডে অপ্রয়োজনীয় চমক এড়ানোর জন্য। evalখুব শক্তিশালী তবে আমি নিশ্চিত যে আপনি এটি ইতিমধ্যে জানেন

বিটিডাব্লু, যদি এটি আইনী হত literal objectতবে আমরা ভেরিয়েবলের নাম এবং মান ক্যাপচার করতে পারি তবে আমরা সংখ্যার সম্পত্তি এবং সম্পত্তি মূল্য সংশ্লেষ করতে পারি না, দুঃখের বিষয়, এটি অবৈধ is

functopn example( varName ){
    var var1 = 'foo', var2 ='bar'

    var capture = {[varName]}

}

example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`

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

দুর্দান্ত সমাধান
রোহিত পার্ট

4

আপনি যদি উইন্ডো বা গ্লোবাল (নোড) এর মতো কোনও গ্লোবাল অবজেক্টটি ব্যবহার করতে না চান তবে আপনি এই জাতীয় কিছু চেষ্টা করতে পারেন:

var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';

console.log(obj['whatever']);

4

আমার ফ্লাই এবং অবজেক্ট ওয়েতে একাধিক ফর্মডাটা আঁকার দরকার ছিল

var forms = {}

তারপরে আমার লুপগুলিতে আমার ব্যবহৃত ফর্ম ডেটা তৈরি করা দরকার

forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);

ধন্যবাদ ... এটি আমাকে পুরোপুরি বাঁচিয়েছে! । এই $ refs [ 'listView + সূচক] .nativeView.animate ({..}) আমি Vars ভালো refs ভিতরে প্রয়োজন $ refs.listView1 listView2 ইত্যাদি ...।
Meiki নিউম্যান

2

যাদের গতিশীল নামযুক্ত ভেরিয়েবল রফতানি করা দরকার তাদের জন্য এটি বিকল্প

export {
  [someVariable]: 'some value',
  [anotherVariable]: 'another value',
}

// then.... import from another file like this:
import * as vars from './some-file'

আরেকটি বিকল্প হ'ল এমন একটি বস্তু তৈরি করা যার কীগুলির নাম পরিবর্তনশীল

const vars = { [someVariable]: 1, [otherVariable]: 2 };

// consume it like this
vars[someVariable];

1

তাদের অর্থ হ'ল না, আপনি পারবেন না। এটি করার কোনও উপায় নেই। সুতরাং এটি সম্ভব ছিল আপনি এই জাতীয় কিছু করতে পারেন

function create(obj, const){
// where obj is an object and const is a variable name
function const () {}

const.prototype.myProperty = property_value;
// .. more prototype

return new const();

}

ECMAScript 5 তে যেমন প্রয়োগ করা হয়েছে তেমন একটি ক্রিয়াকলাপ তৈরি করা।


4
সাবধানতা: কনস্টটি ES6
তেজাস মনোহর

4
... এবং তার আগে একটি ভবিষ্যতের সংরক্ষিত শব্দ ছিল
টিজে ক্রাউডার 16

নেই evalঅপারেটর
pery mimon

1

eval () আমার পরীক্ষায় কাজ করেনি। তবে ডিওএম ট্রিটিতে নতুন জাভাস্ক্রিপ্ট কোড যুক্ত করা সম্ভব। সুতরাং এখানে একটি ফাংশন যা একটি নতুন ভেরিয়েবল যুক্ত করে:

function createVariable(varName,varContent)
{
  var scriptStr = "var "+varName+"= \""+varContent+"\""

  var node_scriptCode = document.createTextNode( scriptStr )
  var node_script = document.createElement("script");
  node_script.type = "text/javascript"
  node_script.appendChild(node_scriptCode);

  var node_head = document.getElementsByTagName("head")[0]
  node_head.appendChild(node_script);
}

createVariable("dynamicVar", "some content")
console.log(dynamicVar)

2
ছোট উন্নতি এটি ব্যবহার করাই ভালো var node_head = document.getElementsByTagName("head")[0], আইডি পরিবর্তে কোন এক একটি দেয় id="head"করার <head>:-)
ddlab

আমি করি :) তবে ধন্যবাদ, এখন আমি অবশেষে এই আইডি = "মাথা" জিনিসটি সরিয়ে ফেলতে পারি
এক্সেল হেইডার

1
এটি কেবল একটি বৈশ্বিক পরিবর্তনশীল তৈরির একটি অতি জটিল উপায় বলে মনে হচ্ছে ?! (... এবং এটি কীভাবে প্রশ্নের উত্তর দেয়?)
মিঃ হোয়াইট

প্রতিভা :) এর সমাধান হল সমাধান। এমনকি যদি আপনার কোডটি কাজ না করে
পেরে মিমন

1

যদিও এর স্বীকৃত উত্তর থাকলেও আমি একটি পর্যবেক্ষণ যোগ করতে চাই:

ES6 এ ব্যবহার let করে কাজ হয় না :

/*this is NOT working*/
let t = "skyBlue",
    m = "gold",
    b = "tomato";

let color = window["b"];
console.log(color);

তবে কাজ ব্যবহার var করে

/*this IS working*/
var t = "skyBlue",
    m = "gold",
    b = "tomato";

let color = window["b"];
console.log(color);

আমি আশা করি এটি কারওর পক্ষে কার্যকর হতে পারে।


1
একই প্রয়োগ হয়const

1
সত্য। কিন্তু আপনি ভেরিয়েবল সঙ্গে একটি বস্তু তৈরি এবং সেখান থেকে পরিবর্তনশীল নির্বাচন করতে পারেন: const vars = { t, m, b }; console.log(vars['b'])। অন্যথায় evalখুব কাজ করে।
ফ্যাবিয়ান ভন এলার্টস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.