আমি গতিশীল নাম ব্যবহার করে কোনও বস্তুর সম্পত্তিতে অ্যাক্সেস করার চেষ্টা করছি। এটা কি সম্ভব?
const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
আমি গতিশীল নাম ব্যবহার করে কোনও বস্তুর সম্পত্তিতে অ্যাক্সেস করার চেষ্টা করছি। এটা কি সম্ভব?
const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
উত্তর:
আছে এক্সেস বৈশিষ্ট্য করার দুটি উপায় একটি বস্তুর:
something.bar
something['bar']
বন্ধনীগুলির মধ্যে মানটি কোনও অভিব্যক্তি হতে পারে। অতএব, সম্পত্তিটির নামটি যদি কোনও ভেরিয়েবলে সঞ্চিত থাকে তবে আপনাকে বন্ধনী স্বরলিপি ব্যবহার করতে হবে:
var foo = 'bar';
something[foo];
// both x = something[foo] and something[foo] = x work as expected
এটি আমার সমাধান:
function resolve(path, obj) {
return path.split('.').reduce(function(prev, curr) {
return prev ? prev[curr] : null
}, obj || self)
}
ব্যবহারের উদাহরণ:
resolve("document.body.style.width")
// or
resolve("style.width", document.body)
// or even use array indexes
// (someObject has been defined in the question)
resolve("part.0.size", someObject)
// returns null when intermediate properties are not defined:
resolve('properties.that.do.not.exist', {hello:'world'})
জাভাস্ক্রিপ্টে আমরা এর সাথে অ্যাক্সেস করতে পারি:
foo.bar
foo[someVar]
বাfoo["string"]
তবে কেবলমাত্র দ্বিতীয় ক্ষেত্রে গতিশীলভাবে বৈশিষ্ট্য অ্যাক্সেস করতে দেয়:
var foo = { pName1 : 1, pName2 : [1, {foo : bar }, 3] , ...}
var name = "pName"
var num = 1;
foo[name + num]; // 1
// --
var a = 2;
var b = 1;
var c = "foo";
foo[name + a][b][c]; // bar
নীচে আপনি কীভাবে দুটি স্ট্রিং সংশ্লেষ করে গতিশীলভাবে উত্পাদিত একটি সম্পত্তি নাম ব্যবহার করে কোনও সামগ্রীর সম্পত্তি ব্যবহার করতে পারবেন তার একটি ES6 উদাহরণ রয়েছে।
var suffix = " name";
var person = {
["first" + suffix]: "Nicholas",
["last" + suffix]: "Zakas"
};
console.log(person["first name"]); // "Nicholas"
console.log(person["last name"]); // "Zakas"
এগুলিকে গণনা করা সম্পত্তির নাম বলা হয়
আপনি বেশ কয়েকটি ভিন্ন উপায়ে এটি অর্জন করতে পারেন।
let foo = {
bar: 'Hello World'
};
foo.bar;
foo['bar'];
ব্র্যাকেট স্বরলিপিটি বিশেষভাবে শক্তিশালী কারণ এটি আপনাকে ভেরিয়েবলের উপর ভিত্তি করে কোনও সম্পত্তি অ্যাক্সেস করতে দেয়:
let foo = {
bar: 'Hello World'
};
let prop = 'bar';
foo[prop];
এটি কোনও অবজেক্টের প্রতিটি সম্পত্তি জুড়ে লুপিং পর্যন্ত বাড়ানো যেতে পারে। এটি আরও ... এর ... এর মতো নতুন জাভাস্ক্রিপ্ট নির্মানের কারণে অপ্রয়োজনীয় বলে মনে হতে পারে তবে ব্যবহারের ক্ষেত্রে এটি চিত্রিত করতে সহায়তা করে:
let foo = {
bar: 'Hello World',
baz: 'How are you doing?',
last: 'Quite alright'
};
for (let prop in foo.getOwnPropertyNames()) {
console.log(foo[prop]);
}
বিন্দু এবং বন্ধনী উভয় চিহ্নই নেস্টেড বস্তুর জন্য প্রত্যাশা অনুযায়ী কাজ করে:
let foo = {
bar: {
baz: 'Hello World'
}
};
foo.bar.baz;
foo['bar']['baz'];
foo.bar['baz'];
foo['bar'].baz;
অবজেক্ট ডেস্ট্রাকচারিং
আমরা কোনও বস্তুর কোনও সম্পত্তি অ্যাক্সেসের মাধ্যম হিসাবে অবজেক্ট ডেস্ট্রাকচারিংকেও বিবেচনা করতে পারি, তবে নিম্নরূপ:
let foo = {
bar: 'Hello World',
baz: 'How are you doing?',
last: 'Quite alright'
};
let prop = 'last';
let { bar, baz, [prop]: customName } = foo;
// bar = 'Hello World'
// baz = 'How are you doing?'
// customName = 'Quite alright'
লোড্যাশ গেট ব্যবহার করে আপনি এটি এর মতো করতে পারেন
_.get(object, 'a[0].b.c');
আমি নীচে মন্তব্যগুলি বিবেচনায় নিয়েছি এবং সম্মত হয়েছি। এভাল এড়ানো যায়।
অবজেক্টে মূল বৈশিষ্ট্য অ্যাক্সেস সহজেই অর্জন করা হয় obj[variable]
, কিন্তু নেস্টেড হওয়া জিনিস জটিল করে তোলে। ইতিমধ্যে লিখিত কোডটি ব্যবহার করার পরামর্শ দিচ্ছি না lodash.get
।
উদাহরণ
// Accessing root property
var rootProp = 'rootPropert';
_.get(object, rootProp, defaultValue);
// Accessing nested property
var listOfNestedProperties = [var1, var2];
_.get(object, listOfNestedProperties);
লোড্যাশ গেটটি বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে, এখানে ডকুমেন্টেশন লোডাশ.জেটের লিঙ্ক
eval
যখনই সম্ভব এটি ব্যবহার করা এড়ানো ভাল । stackoverflow.com/questions/86513/…
eval
বৈশিষ্ট্য অ্যাক্সেস হিসাবে তুচ্ছ কিছু হিসাবে ব্যবহার করা সহজ ওভারকিল এবং যে কোনও পরিস্থিতিতে খুব কমই পরামর্শ দেওয়া হয়। "ঝামেলা" কি? obj['nested']['test']
খুব ভাল কাজ করে এবং আপনার স্ট্রিংয়ে কোড এমবেড করার দরকার নেই।
obj['nested']['value']
- বাচ্চাদের মনে রাখবেন, খারাপ খারাপ!
_.get
টেবিলে আনতে চান । আমি মনে করি এই উত্তরটি এখন ডাউনভোটের পরিবর্তে উর্ধ্বতনগুলির দাবিদার। এটি ওভারকিল হতে পারে তবে এটি বিদ্যমান তা জেনে রাখা ভাল।
যখনই আপনার গতিশীলভাবে সম্পত্তি অ্যাক্সেস করার প্রয়োজন হবে তখন সম্পত্তি অ্যাক্সেস না করার জন্য আপনাকে স্কয়ার ব্র্যাকেট ব্যবহার করতে হবে ""। অপারেটর
সিনট্যাক্স: অবজেক্ট [যথাযথ}
const something = { bar: "Foobar!" };
const foo = 'bar';
// something.foo; -- not correct way at it is expecting foo as proprty in something={ foo: "value"};
// correct way is something[foo]
alert( something[foo])
আমি এমন একটি মামলা জুড়ে এসেছি যেখানে আমি ভেবেছিলাম যে কোনও বস্তুর সম্পত্তির "ঠিকানা "টিকে অন্য ফাংশনে ডেটা হিসাবে পাস করতে এবং অবজেক্টটি (এজেএক্স সহ) পপুলেট করতে, অ্যাড্রেসের অ্যারে থেকে অনুসন্ধান করতে এবং অন্য ফাংশনে প্রদর্শন করতে চাই। স্ট্রিং অ্যাক্রোব্যাটিক্স না করে আমি বিন্দু চিহ্নিতকরণ ব্যবহার করতে পারি না তাই আমি ভেবেছিলাম পরিবর্তে কোনও অ্যারে পাস করা ভাল। আমি যাইহোক যাইহোক কিছু আলাদা করে শেষ করেছি, তবে এই পোস্টটির সাথে সম্পর্কিত বলে মনে হচ্ছে।
আমি যে ভাষা থেকে ডেটা চেয়েছিলাম তার মতো একটি ভাষা ফাইলের সামগ্রীর নমুনা এখানে:
const locs = {
"audioPlayer": {
"controls": {
"start": "start",
"stop": "stop"
},
"heading": "Use controls to start and stop audio."
}
}
আমি এই জাতীয় ভাষার পাঠ্য অ্যাক্সেস করতে যেমন: ["অডিওপ্লেয়ার", "নিয়ন্ত্রণ", "থামান"] যেমন একটি অ্যারে পাস করতে সক্ষম হতে চেয়েছিলাম।
আমি এই ছোট্ট ফাংশনটি তৈরি করেছি যা "সর্বনিম্ন নির্দিষ্ট" (প্রথম) ঠিকানা পরামিতিটি দেখায় এবং প্রত্যাবর্তিত অবজেক্টটিকে নিজের কাছে পুনরায় নিযুক্ত করে। তারপরে যদি এটি বিদ্যমান থাকে তবে পরবর্তী সর্বাধিক নির্দিষ্ট ঠিকানা পরামিতিটি সন্ধান করতে প্রস্তুত।
function getText(selectionArray, obj) {
selectionArray.forEach(key => {
obj = obj[key];
});
return obj;
}
ব্যবহার:
/* returns 'stop' */
console.log(getText(["audioPlayer", "controls", "stop"], locs));
/* returns 'use controls to start and stop audio.' */
console.log(getText(["audioPlayer", "heading"], locs));
এটি আকর্ষণীয় হয়ে ওঠে যখন আপনাকে এই ফাংশনেও পরামিতিগুলি পাস করতে হবে।
কোড jsfiddle
var obj = {method:function(p1,p2,p3){console.log("method:",arguments)}}
var str = "method('p1', 'p2', 'p3');"
var match = str.match(/^\s*(\S+)\((.*)\);\s*$/);
var func = match[1]
var parameters = match[2].split(',');
for(var i = 0; i < parameters.length; ++i) {
// clean up param begninning
parameters[i] = parameters[i].replace(/^\s*['"]?/,'');
// clean up param end
parameters[i] = parameters[i].replace(/['"]?\s*$/,'');
}
obj[func](parameters); // sends parameters as array
obj[func].apply(this, parameters); // sends parameters as individual values
এই সাধারণ টুকরো কোডটি প্রতিটি ভেরিয়েবলটি পরীক্ষা না করেই গভীরভাবে নেস্টেড ভেরিয়েবল / মান অস্তিত্বের জন্য যাচাই করতে পারে ...
var getValue = function( s, context ){
return Function.call( context || null, 'return ' + s )();
}
যাত্রা। - অবজেক্টগুলির একটি গভীরভাবে নেস্টেড অ্যারে:
a = [
{
b : [
{
a : 1,
b : [
{
c : 1,
d : 2 // we want to check for this
}
]
}
]
}
]
পরিবর্তে :
if(a && a[0] && a[0].b && a[0].b[0] && a[0].b[0].b && a[0].b[0].b[0] && a[0].b[0].b[0].d && a[0].b[0].b[0].d == 2 ) // true
আমরা এখন করতে পারি:
if( getValue('a[0].b[0].b[0].d') == 2 ) // true
চিয়ার্স!
আমি এমন একটি প্রশ্ন জিজ্ঞাসা করেছি যা কিছুক্ষণ আগে কিন্ডা এই বিষয়টির নকল করেছিল এবং অত্যধিক গবেষণা করার পরে এবং প্রচুর তথ্য যে এখানে থাকা উচিত ছিল তা দেখে আমার মনে হয় এই পুরানো পোস্টে যুক্ত করার জন্য আমার কাছে মূল্যবান কিছু আছে।
let properyValue = element.style['enter-a-property'];
তবে আমি এই রুটে খুব কমই যেতে পারি কারণ এটি স্টাইল শিটের মাধ্যমে নির্ধারিত সম্পত্তি মানগুলিতে কাজ করে না। আপনাকে উদাহরণ দেওয়ার জন্য, আমি কিছুটা সিডো কোড দিয়ে প্রদর্শন করব।
let elem = document.getElementById('someDiv');
let cssProp = elem.style['width'];
উপরের কোড উদাহরণ ব্যবহার করে; 'এলিম' ভেরিয়েবলের মধ্যে সঞ্চিত ডিভ উপাদানটির প্রস্থ সম্পত্তিটি যদি কোনও সিএসএস স্টাইল-শিটে স্টাইল করা হয় এবং এর HTML ট্যাগের অভ্যন্তরে স্টাইল করা না হয় তবে আপনি কোনও সন্দেহ ছাড়াই ভিতরে সঞ্চিত অনির্ধারিত মানের ফেরত মূল্য পেতে চলেছেন সিএসএসপ্রপ ভেরিয়েবলের। অপরিবর্তিত মানটি ঘটে কারণ সঠিক মান পাওয়ার জন্য, সিএসএস স্টাইল-শীটের অভ্যন্তরে লিখিত কোডটি মান পাওয়ার জন্য গননা করা দরকার; আপনার অবশ্যই একটি পদ্ধতি ব্যবহার করতে হবে যা স্টাইল শিটের মধ্যে থাকা সম্পত্তিটির মূল্য গণনা করবে।
function getCssProp(){
let ele = document.getElementById("test");
let cssProp = window.getComputedStyle(ele,null).getPropertyValue("width");
}
ডাব্লু 3 স্কুলগুলি কমপুটেডভ্যালু ডক এটির একটি ভাল উদাহরণ দেয় এবং আপনাকে এটি দিয়ে খেলতে দেয় তবে যাইহোক, এই লিঙ্কটি মজিলা সিএসএস getComputesValue ডকটি getComputesValue ফাংশন সম্পর্কে বিস্তারিত আলোচনা করে এবং এই বিষয়ে সম্পূর্ণ স্পষ্ট নয় এমন কোনও উচ্চাকাঙ্ক্ষী বিকাশকারীকে পড়া উচিত।
$(selector).css(property,value)
... পেতে এবং সেট আছে। আমি যা ব্যবহার করি তা হ'ল একমাত্র নেতিবাচকতা আপনি জিকুয়েরি সম্পর্কে জানতে পেরেছিলেন, তবে প্রতিটি জাভাস্ক্রিপ্ট বিকাশকারী জিকুয়েরি শিখতে হবে এটি খুব ভাল কারণগুলির মধ্যে একটি, এটি কেবল জীবনকে সহজ করে তোলে এবং এর মতো পদ্ধতি উপস্থাপন করে, যা মানক জাভাস্ক্রিপ্ট সহ উপলব্ধ নেই। আশা করি এটি কাউকে সাহায্য করবে !!!
যে কোনও নেস্টেড ভেরিয়েবলের মান নির্ধারণ করতে চাইছেন, এটি কীভাবে করবেন তা এখানে:
const _ = require('lodash'); //import lodash module
var object = { 'a': [{ 'b': { 'c': 3 } }] };
_.set(object, 'a[0].b.c', 4);
console.log(object.a[0].b.c);
// => 4
ডকুমেন্টেশন: https://lodash.com/docs/4.17.15#set
এছাড়াও, কোনও মান পেতে চাইলে ডকুমেন্টেশন: https://lodash.com/docs/4.17.15#get
আপনার ব্যবহার করা উচিত JSON.parse
, https://www.w3schools.com/js/js_json_parse.asp এ একবার দেখুন
const obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}')
console.log(obj.name)
console.log(obj.age)