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


91

আমি কোনও বস্তু অ্যাক্সেস করতে ভেরিয়েবলের মানটি ব্যবহার করতে চাই।

ধরা যাক আমার কাছে মাইওবজেক্ট নামে একটি জিনিস রয়েছে।

আমি এই নামের সাথে একটি ভেরিয়েবল পূরণ করতে এবং অবজেক্ট অ্যাক্সেস করতে ভেরিয়েবলটি ব্যবহার করতে চাই।

উদাহরণ:

var objname = 'myobject';
{objname}.value = 'value';

উত্তর:


125

গ্লোবাল:

myObject = { value: 0 };
anObjectName = "myObject";
this[anObjectName].value++;

console.log(this[anObjectName]);

গ্লোবাল: ভি 2

var anObjectName = "myObject";
this[anObjectName] = "myvalue"

console.log(myObject)

স্থানীয়: ভি 1

(function() {
    var scope = this;

    if (scope != arguments.callee) {
        arguments.callee.call(arguments.callee);
        return false;
    }

    scope.myObject = { value: 0 };
    scope.anObjectName = "myObject";
    scope[scope.anObjectName].value++;

    console.log(scope.myObject.value);
})();

স্থানীয়: v2

(function() {  
    var scope = this;

    scope.myObject = { value: 0 };
    scope.anObjectName = "myObject";
    scope[scope.anObjectName].value++;

    console.log(scope.myObject.value);    
}).call({});

@Shaz - যারা রেফারেন্স একই সুযোগ আসলে ;-) উভয় (ধরে নেওয়া যাক তারা একটি ব্রাউজারে মৃত্যুদন্ড কার্যকর করা হয়।) alert(this === window)
শান ভাইয়েরা

4
@PeeHaa - স্থানীয় উদাহরণ একটি পরিবর্তনশীল সেট করে windowবস্তুর নামক objnameযা পরে উল্লেখ করা হয় মাধ্যমে this... আপনি প্রতিস্থাপন পারে windowজন্য thisদ্বিতীয় উদাহরণে এবং সবকিছু এখনও কাজ করবে। :-)
সান ভিয়েরা

4
@ সানভিয়েরা: আপডেট হওয়া উদাহরণটি একবার দেখুন। আশা করি এটি এখন সঠিকভাবে কাজ করে।
শাজ

4
@ শ্যাজ - অবমূল্যায়ন arguments.calleeকরা হয়েছে তবে এটি তবে খুব চালাক বাস্তবায়ন হয় - এবং এটি বিশ্বব্যাপী সুযোগকে লিপ্ত করে না। +1
শান ভাইয়েরা

4
এটি বৈশ্বিক সুযোগকে দূষিত করছে না, তবে এটি এমন একটি বিষয় তৈরি করছে যা ফাংশনটির প্রতিটি অনুরোধ দ্বারা ভাগ করা হয়। আপনার ফাংশনটি objnameফাংশনের নিজেই একটি সম্পত্তি হিসাবে ধরে আছে । এটি পুনরাবৃত্ত ফাংশনগুলির জন্য ব্যর্থ হতে পারে। কীভাবে এটি বাস্তব বিশ্বে ব্যবহার করা যেতে পারে তা নিশ্চিত নয়।
জুয়ান মেন্ডেস

27

পরিবর্তনশীল নামের আশেপাশে বর্গাকার বন্ধনী ব্যবহার করুন।

var objname = 'myobject';
{[objname]}.value = 'value';

7
এটি নিখুঁত এবং সহজ এবং শীর্ষ উত্তর হওয়া উচিত।
ব্র্যাড

4
এটি একটি ব্যতিক্রম ছুঁড়েছে: সিনট্যাক্স এরির: প্রত্যাশিত অভিব্যক্তি, পেয়েছে '। এটা কাজ করে না; এত উপভোগ কেন?
Lovro

9

এটি কি বিশ্বব্যাপী পরিবর্তনশীল? যদি তা হয় তবে এগুলি আসলে windowঅবজেক্টের অংশ , সুতরাং আপনি এটি করতে পারেন window[objname].value

যদি এটি কোনও ফাংশনে স্থানীয় হয়, তবে আপনি যা চান তা করার কোনও ভাল উপায় আছে বলে আমি মনে করি না।


8

অবজেক্টটি কিছু স্কোপে বিদ্যমান, সুতরাং আপনি প্রায়শই এই সিনট্যাক্সের মাধ্যমে চলকটি অ্যাক্সেস করতে পারেন:

var objname = "myobject";
containing_scope_reference[objname].some_property = 'some value';

আপনি যখন ক্লোসড স্কোপে থাকবেন এবং আপনি শীর্ষ স্তরের স্থানীয় ভেরিয়েবল অ্যাক্সেস চান তখন কেবল এই জায়গাটিই জটিল হয়ে ওঠে। আপনার যখন এই জাতীয় কিছু থাকে:

(function(){
    var some_variable = {value: 25};
    var x = "some_variable";
    console.log(this[x], window[x]); // Doesn't work
})();

আপনি করতে পারেন ব্যবহার করে যে কাছাকাছি পেতে evalপরিবর্তে বর্তমান সুযোগ শৃঙ্খল অ্যাক্সেস করতে ... কিন্তু আমি এটা বলতে না করার পরীক্ষার অনেক কাজ করেছি এবং আপনি জানেন যে জিনিস সম্পর্কে যেতে এটি সর্বোত্তম উপায়।

(function(){
    var some_variable = {value: 25};
    var x = "some_variable";
    eval(x).value = 42;
    console.log(some_variable); // Works
})();

তোমার শ্রেষ্ঠ বাজি সর্বদা চালু টু হতে-সেখানে বস্তু (মত একটি নাম একটি রেফারেন্স থাকতে হয় thisবিশ্বব্যাপী সুযোগ বা স্থানীয় সুযোগ একটি ব্যক্তিগত টপ লেভেল পরিবর্তনশীল) ও করা সবকিছু সেখানে অন্য।

এইভাবে:

var my_outer_variable = {};
var outer_pointer = 'my_outer_variable';
// Reach my_outer_variable with this[outer_pointer]
// or window[outer_pointer]

(function(){
    var my_inner_scope = {'my_inner_variable': {} };
    var inner_pointer = 'my_inner_variable';
    // Reach my_inner_variable by using
    // my_inner_scope[inner_pointer]
})();

7

আপনি ব্যবহার করতে পারেন eval:

eval(variablename + ".value = 'value'");

evalবিবেচনা করা হয় না evil? যদি না হয় আমি এটি ব্যবহার করতে পারেন। কারণ এটি এখন একটি বিশ্বব্যাপী তবে আমি জিনিস পরিষ্কার করার জন্য এটি একটি ফাংশনে স্থানান্তরিত করতে চেয়েছিলাম।
PeeHaa

4
হাঃ হাঃ হাঃ. যদি ভেরিয়েবলের নামটি ব্যবহারকারীর ইনপুট থেকে আসে তবে নিশ্চিত হয়ে নিন যে আপনি এটিকে বৈধ করেছেন, যাতে এতে কোনও জেএস কোড না রয়েছে যা evalকার্যকর করতে পারে।
মিডাস

4
এটি evalআমার মতে কয়েকটি বৈধ ব্যবহারের মধ্যে একটি । আমাদের অবশ্যই ভেরিয়েবলটি পরিষ্কার কিনা তা নিশ্চিত করতে হবে।
লেভি মরিসন

4
হ্যাঁ এটি আসলে কোনও সমস্যা নয়। তবে শাজের উত্তরটি একবার দেখুন। আমি মনে করি এটি আরও পরিষ্কার সমাধান।
মিডাস

4
@ পেহাহা: আপনি যদি এটিকে সরিয়ে নেওয়ার বিষয়টি বিবেচনা করছেন, তবে কেন এটিকে কোনও পরিচিত বস্তুর সম্পত্তি হিসাবে স্থানান্তর করবেন না, যাতে আপনি এর মতো কিছু করতে পারেন myVar[objname].value?
জেডাব্লু

6

উইন্ডো স্কোপ ব্যতীত আপনি যেখানে এটি লিখতে পারবেন তা বাদ দিয়ে আপনি এটি সাধারণভাবে করতে পারবেন না window[objname].value = 'value';


4

আমি মনে করি স্থানীয় ভেরিয়েবলের জন্য শাজের উত্তরটি বোঝা শক্ত, যদিও এটি পুনরাবৃত্তিযোগ্য ফাংশনের জন্য কাজ করে। এখানে আরও একটি উপায় রয়েছে যা আমি মনে করি এটি পরিষ্কার হয় (তবে এটি এখনও তার ধারণা, সঠিক একই আচরণ)। এটি স্থানীয় পরিবর্তনশীলগুলিকে গতিশীলভাবে অ্যাক্সেস করে না, কেবল স্থানীয় ভেরিয়েবলের সম্পত্তি।

মূলত, এটি একটি গ্লোবাল ভেরিয়েবল (ফাংশন অবজেক্টের সাথে সংযুক্ত) ব্যবহার করছে

// Here's  a version of it that is more straight forward.
function doIt() {
    doIt.objname = {};
    var someObject = "objname";
    doIt[someObject].value = "value";    
    console.log(doIt.objname);
})();

যা ভেরিয়েবল সংরক্ষণের জন্য গ্লোবাল তৈরির মূলত একই জিনিস, তাই আপনি এটি সম্পত্তি হিসাবে অ্যাক্সেস করতে পারেন। এটি করার জন্য একটি গ্লোবাল তৈরি করা এমন হ্যাক।

এখানে এমন একটি ক্লিনার হ্যাক যা গ্লোবাল ভেরিয়েবলগুলি তৈরি করে না, পরিবর্তে এটি স্থানীয় ভেরিয়েবল ব্যবহার করে।

function doIt() {
  var scope = {
     MyProp: "Hello"
  };
  var name = "MyProp";
  console.log(scope[name]);
}

জাভাস্ক্রিপ্ট দেখুন : স্ট্রিংকে অবজেক্ট রেফারেন্স হিসাবে ব্যাখ্যা করুন?


1

যদি বস্তুটি কোনও নেমস্পেসে থাকে তবে। Company.Module.Components.Fooআপনি এই ফাংশনটি ব্যবহার করতে পারেন:

কফিস্ক্রিপ্ট:

objByName: (name, context = window) ->
    ns = name.split "."
    func = context
    for n, i in ns
        func = func[n]
    return func

প্রতিক্রিয়াযুক্ত জেএস:

objByName: function(name, context) {
  var func, i, n, ns, _i, _len;
  if (context == null) {
    context = window;
  }
  ns = name.split(".");
  func = context;
  for (i = _i = 0, _len = ns.length; _i < _len; i = ++_i) {
    n = ns[i];
    func = func[n];
  }
  return func;
}

তারপরে আপনি একটি নতুন অবজেক্ট তৈরি করতে বা যা কিছু করতে পারেন। মাধ্যমে প্রথম বন্ধনী নোট করুন।

var o = new (objByName('Company.Module.Components.Foo'))
objByName('some.deeply.nested.object').value

এই ধারণাটি অনুরূপ প্রশ্ন থেকে নেওয়া হয়েছে: একটি জাভাস্ক্রিপ্ট ক্রিয়াকলাপ কীভাবে কার্যকর করতে হয় যখন আমার স্ট্রিংয়ের নাম হয়


1
let players = [];
players[something] = {};
players[something].somethingElse = 'test';
console.log(players); 

-> [কিছু: {কিছুর বাইরে: 'পরীক্ষা'}];


0

উইন্ডোটি ব্যবহার করার সময় [আপত্তি নাম], দয়া করে নিশ্চিত হয়ে নিন যে নামটির নামটি বৈশ্বিক চলক। অন্যথায়, কিছু সময় কাজ করবে, এবং কখনও কখনও ব্যর্থ হবে। উইন্ডো [اعتراض নাম]। মূল্য।


0

উত্তরগুলির সাথে আমার যে চ্যালেঞ্জগুলি ছিল সেগুলির মধ্যে একটি হ'ল এটি ধরে নেওয়া হয়েছিল যে বিষয়টিটি একক স্তর ছিল। উদাহরণ স্বরূপ,

const testObj = { testKey: 'testValue' }
const refString = 'testKey';
const refObj = testObj[refString];

ভাল কাজ করে, কিন্তু

const testObj = { testKey:
                  { level2Key: 'level2Value' }
                }
const refString = 'testKey.level2Key';
const refObj = testObj[refString];

কাজ করে না.

আমি যা করতে পেরেছি তা হল বহু-স্তরের অবজেক্টগুলিতে অ্যাক্সেস পাওয়ার জন্য একটি ফাংশন তৈরি করা:

objVar(str) {
    let obj = this;
    const parts = str.split('.');
    for (let p of parts) {
        obj = obj[p];
    }
    return obj;
}

দ্বিতীয় দৃশ্যে, তারপরে, আমি যে বিষয়টির সন্ধান করছি সেটিকে ফিরে পেতে আমি এই ফাংশনটির কাছে স্ট্রিংটি পাস করতে পারি:

const testObj = { testKey:
                  { level2Key: 'level2Value' }
                }
const refString = 'testObj.testKey.level2Key';
const refObj = objVar[refString];


0

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

   const iconObj = {
    ZondIcons,
    MaterialIcons,
  }
  const objValue = iconObj[iconLib][propertyName]

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