যদি জাভাস্ক্রিপ্ট অবজেক্ট থাকে:
var objects={...};
মনে করুন, এর 50 টিরও বেশি সম্পত্তি রয়েছে, সম্পত্তির নাম না জেনে (এটি 'কীগুলি' না জেনে) কীভাবে প্রতিটি লুপে প্রতিটি সম্পত্তি মান পাবেন?
যদি জাভাস্ক্রিপ্ট অবজেক্ট থাকে:
var objects={...};
মনে করুন, এর 50 টিরও বেশি সম্পত্তি রয়েছে, সম্পত্তির নাম না জেনে (এটি 'কীগুলি' না জেনে) কীভাবে প্রতিটি লুপে প্রতিটি সম্পত্তি মান পাবেন?
উত্তর:
একটি সাধারণ for..in
লুপ ব্যবহার করে :
for(var key in objects) {
var value = objects[key];
}
enumerable
পতাকাটি মিথ্যাতে সেট করা আছে। এটি - অন্যান্য বিষয়গুলির মধ্যে - এর অর্থ আপনি কোনও শ্রেণি পদ্ধতিতে পুনরাবৃত্তি করবেন না, তবে আপনি অন্যান্য উপায়ে তৈরি পদ্ধতিগুলির মাধ্যমে পুনরাবৃত্তি করবেন।
আপনাকে কোন ব্রাউজারগুলি সমর্থন করতে হবে তার উপর নির্ভর করে এটি বিভিন্ন উপায়ে করা যেতে পারে। বন্য সমর্থনকারী ECMAScript 5 (ES5) এর অপ্রতিরোধ্য সংখ্যাগরিষ্ঠ ব্রাউজারগুলি, তবে সতর্কতা অবলম্বন করা উচিত যে নীচে ব্যবহার করা নীচের অনেকগুলি উদাহরণ Object.keys
, যা আইই <9 এ উপলব্ধ নয় । সামঞ্জস্যতার টেবিলটি দেখুন ।
যদি আপনাকে আইই এর পুরানো সংস্করণগুলি সমর্থন করতে হয়, তবে এটি আপনার জন্য বিকল্প:
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var val = obj[key];
// use val
}
}
নেস্টেড if
নিশ্চিত করে তোলে যে আপনি অবজেক্টের প্রোটোটাইপ চেইনে সম্পত্তিগুলির চেয়ে বেশি পরিমাণে গণনা করবেন না (যা আপনি প্রায় অবশ্যই চান এমন আচরণ)। আপনার অবশ্যই ব্যবহার করা উচিত
Object.prototype.hasOwnProperty.call(obj, key) // ok
বরং
obj.hasOwnProperty(key) // bad
কারণ ECMAScript 5+ আপনাকে প্রোটোটাইপহীন অবজেক্টগুলি তৈরি করতে দেয় Object.create(null)
এবং এই বিষয়গুলির কোনও hasOwnProperty
পদ্ধতি থাকে না। দুষ্টু কোডও এমন পদার্থ তৈরি করতে পারে যা hasOwnProperty
পদ্ধতিটিকে ওভাররাইড করে ।
আপনি এই পদ্ধতিগুলি যে কোনও ব্রাউজারে ব্যবহার করতে পারেন যা 5 বা তদুর্ধের ইসমাস্ক্রিপ্ট সমর্থন করে। এগুলি কোনও বস্তুর কাছ থেকে মান পায় এবং প্রোটোটাইপ চেইনের উপর দিয়ে অঙ্কগুলি এড়ায়। obj
আপনার বস্তুটি কোথায় :
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
var val = obj[keys[i]];
// use val
}
আপনি যদি আরও কিছু কমপ্যাক্ট কিছু চান বা আপনি লুপগুলিতে ফাংশনগুলি সম্পর্কে সতর্কতা অবলম্বন করতে চান তবে Array.prototype.forEach
আপনার বন্ধু:
Object.keys(obj).forEach(function (key) {
var val = obj[key];
// use val
});
পরবর্তী পদ্ধতিটি একটি বস্তুর মান সহ একটি অ্যারে তৈরি করে। এটি লুপিংয়ের জন্য সুবিধাজনক।
var vals = Object.keys(obj).map(function (key) {
return obj[key];
});
// use vals array
আপনি যদি তাদের (যেমনটি ) Object.keys
বিপক্ষে সুরক্ষিত করতে চান তবে আপনি তা করতে পারেন ।null
for-in
Object.keys(obj || {})...
Object.keys
অগণিত বৈশিষ্ট্য ফেরত দেয় । সাধারণ বস্তুর উপর পুনরাবৃত্তি করার জন্য, এটি সাধারণত পর্যাপ্ত। আপনার অ-গণনীয় বৈশিষ্ট্যগুলির সাথে যদি আপনার কিছু কাজ করতে হয় তবে Object.getOwnPropertyNames
আপনি তার জায়গায় ব্যবহার করতে পারেন Object.keys
।
ECMAScript 2015 দিয়ে অ্যারেগুলি পুনরাবৃত্তি করা সহজ। একটি লুপের মধ্যে এক-এক মানের সাথে কাজ করার সময় আপনি আপনার সুবিধার জন্য এটি ব্যবহার করতে পারেন:
for (const key of Object.keys(obj)) {
const val = obj[key];
// use val
}
ECMAScript 2015 ফ্যাট-অ্যার ফাংশন ব্যবহার করে অবজেক্টটিকে মানগুলির একটি অ্যারে ম্যাপিং এক-লাইনারে পরিণত হয়:
const vals = Object.keys(obj).map(key => obj[key]);
// use vals array
ECMAScript 2015 উপস্থাপন করেছে Symbol
, উদাহরণস্বরূপ যা সম্পত্তি নাম হিসাবে ব্যবহৃত হতে পারে। গণনার জন্য কোনও বস্তুর প্রতীক পেতে, ব্যবহার করুন Object.getOwnPropertySymbols
(এই ফাংশনটি ব্যক্তিগত সম্পত্তি তৈরি Symbol
করতে কেন ব্যবহার করা যায় না)। Reflect
ECMAScript 2015 এর নতুন এপিআই সরবরাহ করে Reflect.ownKeys
, যা সম্পত্তির নাম (অ-গণনাযোগ্যগুলি সহ) এবং প্রতীকগুলির তালিকা দেয়।
প্রকাশের পূর্বে ECMAScript 6 থেকে অ্যারে বোঝাপড়াগুলি সরানো হয়েছিল । তাদের অপসারণের আগে, কোনও সমাধান এর মতো দেখতে পেত:
const vals = [for (key of Object.keys(obj)) obj[key]];
// use vals array
ECMAScript 2016 এমন বৈশিষ্ট্য যুক্ত করেছে যা এই বিষয়গুলিকে প্রভাবিত করে না। ECMAScript 2017 স্পেসিফিকেশন যুক্ত করে Object.values
এবং Object.entries
। উভয়ই রিটার্ন অ্যারে (যা কিছুের সাথে উপমা দিয়ে কিছুকে অবাক করে দেবে Array.entries
)। Object.values
হিসাবে বা একটি for-of
লুপ ব্যবহার করা যেতে পারে ।
const values = Object.values(obj);
// use values array or:
for (const val of Object.values(obj)) {
// use val
}
আপনি যদি কী এবং মান উভয়ই ব্যবহার করতে চান তবে Object.entries
তা আপনার জন্য। এটি [key, value]
জোড়া দিয়ে ভরা একটি অ্যারে উত্পাদন করে । আপনি এটিকে যেমনটি ব্যবহার করতে পারেন, বা (ECMAScript 2015 ডেসট্রাকচারিং অ্যাসাইনমেন্টটিও নোট করুন) একটি for-of
লুপে:
for (const [key, val] of Object.entries(obj)) {
// use key and val
}
Object.values
shimঅবশেষে, মন্তব্যে যেমন উল্লেখ করা হয়েছে এবং তেহ_সেনাউসের দ্বারা অন্য উত্তরে, এটি শিম হিসাবে ব্যবহার করার উপযুক্ত হতে পারে। চিন্তা করবেন না, নিম্নলিখিতগুলি প্রোটোটাইপ পরিবর্তন করে না, এটি কেবল একটি পদ্ধতি যুক্ত করে Object
(যা অনেক কম বিপজ্জনক)। ফ্যাট-এ্যার ফাংশনগুলি ব্যবহার করে এটি এক লাইনেও করা যায়:
Object.values = obj => Object.keys(obj).map(key => obj[key]);
যা আপনি এখন পছন্দ মত ব্যবহার করতে পারেন
// ['one', 'two', 'three']
var values = Object.values({ a: 'one', b: 'two', c: 'three' });
যদি কোনও নেটিভ Object.values
অস্তিত্ব থাকে আপনি যদি শিহরণ এড়াতে চান , তবে আপনি এটি করতে পারেন:
Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));
আপনার সমর্থন করার প্রয়োজন ব্রাউজারগুলি / সংস্করণ সম্পর্কে সচেতন হন। পদ্ধতিগুলি বা ভাষার বৈশিষ্ট্যগুলি প্রয়োগ করা হয় সেখানে উপরোক্তগুলি সঠিক। উদাহরণস্বরূপ, ECMAScript 2015 এর জন্য সমর্থনটি সম্প্রতি 8 অবধি ডি 8 ডিফল্ট হিসাবে স্যুইচ অফ ছিল, যা ক্রোমের মতো ব্রাউজারগুলি চালিত করে। আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলি কার্যকর করতে ব্রাউজারগুলি সমর্থন করার ব্র্যান্ডস না হওয়া পর্যন্ত ECMAScript 2015 এর বৈশিষ্ট্যগুলি এড়ানো উচিত। আপনি যদি ECMAScript 5 তে আপনার কোডটি সংকলন করতে বাবেল ব্যবহার করেন , তবে এই উত্তরের সমস্ত বৈশিষ্ট্যে আপনার অ্যাক্সেস রয়েছে।
obj
দুটি বার উল্লেখ করা প্রয়োজন । আমার ধারণা কোনও সহায়ক ফাংশন তৈরি করা কি অনিবার্য? মানগুলির মতো কিছু (আপত্তি)।
Object.values = obj => Object.keys(obj).map(key => obj[key]);
অ্যারেতে মানগুলি পাওয়ার জন্য এখানে পুনরায় ব্যবহারযোগ্য ফাংশন। এটি অ্যাকাউন্টে প্রোটোটাইপগুলিও নেয়।
Object.values = function (obj) {
var vals = [];
for( var key in obj ) {
if ( obj.hasOwnProperty(key) ) {
vals.push(obj[key]);
}
}
return vals;
}
Object
করা কোনও সমস্যা নয় ( Object.keys
সম্ভবত একটি সাধারণ শিম), আপনি সম্ভবত অবজেক্ট প্রোটোটাইপটি পরিবর্তন করার কথা ভাবছেন।
hasOwnProperty()
? কীভাবে সেই কীটির পুনরাবৃত্তি হবে যে সেই বস্তুর লুপের মধ্যে সম্পত্তিটি পেল না?
অ্যান্ডসকোর.জেএস এ আপনার অ্যাক্সেস থাকলে আপনি _.values
ফাংশনটি এটি ব্যবহার করতে পারেন :
_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
আপনি যদি সত্যিই মানগুলির একটি অ্যারে চান তবে লুপের জন্য ... এর সাথে অ্যারে তৈরি করার চেয়ে এই ক্লিনারটি আমি খুঁজে পাই।
ইসিএমএ 5.1+
function values(o) { return Object.keys(o).map(function(k){return o[k]}) }
এটি লক্ষণীয় যে বেশিরভাগ ক্ষেত্রে আপনার সত্যিকারের মানগুলির একটি অ্যারে প্রয়োজন নেই, এটি করা দ্রুত হবে:
for(var k in o) something(o[k]);
এটি অবজেক্ট ও এর কীগুলির দ্বারা পুনরাবৃত্তি হয়। প্রতিটি পুনরাবৃত্তিতে k টি একটি কিতে সেট করা হয়।
ES5 Object.keys
var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]
আপনি কীগুলি দিয়ে লুপ করতে পারেন:
foo = {one:1, two:2, three:3};
for (key in foo){
console.log("foo["+ key +"]="+ foo[key]);
}
আউটপুট হবে:
foo[one]=1
foo[two]=2
foo[three]=3
ECMA2017 এর পরে:
Object.values(obj)
আপনাকে অ্যারের হিসাবে সমস্ত সম্পত্তি মান আনবে।
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
স্পষ্টতই - যেমনটি আমি সম্প্রতি শিখেছি - এটি করার দ্রুততম উপায় এটি:
var objs = {...};
var objKeys = Object.keys(obj);
for (var i = 0, objLen = objKeys.length; i < objLen; i++) {
// do whatever in here
var obj = objs[objKeys[i]];
}
উত্তরাধিকারসূত্রে প্রাপ্ত এবং অগণিত সম্পত্তিও চাওয়া উচিত কিনা তা প্রশ্নটি নির্দিষ্ট করে না।
নেই এছাড়াও সবকিছু, উত্তরাধিকারসূত্রে বৈশিষ্ট্য এবং অ গণনীয় বৈশিষ্ট্য পেয়ে জন্য একটি প্রশ্ন , যে Google সহজে খুঁজে পায় না।
এর জন্য আমার সমাধানটি হ'ল:
function getAllPropertyNames(obj) {
let result = new Set();
while (obj) {
Object.getOwnPropertyNames(obj).forEach(p => result.add(p));
obj = Object.getPrototypeOf(obj);
}
return [...result];
}
এবং তারপরে পুনরাবৃত্তি করুন, কেবলমাত্র একটি লুপ ব্যবহার করুন:
ব্যবহার করুন Object.values()
:, আমরা একটি অবজেক্ট হিসাবে একটি আর্গুমেন্ট হিসাবে পাস এবং একটি মান ফেরতের মান হিসাবে একটি অ্যারে প্রাপ্ত।
এটি প্রদত্ত বস্তুর নিজস্ব অগণিত সম্পত্তি মানগুলির একটি অ্যারে প্রদান করে। for in
লুপটি ব্যবহার করে কিন্তু প্রোটোটাইপের বৈশিষ্ট্য ছাড়াই আপনি একই মান পাবেন । এই উদাহরণটি সম্ভবত বিষয়গুলি আরও পরিষ্কার করে দেবে:
function person (name) {
this.name = name;
}
person.prototype.age = 5;
let dude = new person('dude');
for(let prop in dude) {
console.log(dude[prop]); // for in still shows age because this is on the prototype
} // we can use hasOwnProperty but this is not very elegant
// ES6 +
console.log(Object.values(dude));
// very concise and we don't show props on prototype
এখানে পিএইচপি এর অ্যারে_ভ্যালুগুলির সমান একটি ফাংশন রয়েছে ()
function array_values(input) {
var output = [], key = '';
for ( key in input ) { output[output.length] = input[key]; }
return output;
}
আপনি যদি ES6 বা উচ্চতর ব্যবহার করেন তবে কীভাবে অবজেক্টের মান পাওয়া যায় তা এখানে:
Array.from(values(obj));
যেহেতু, ES7Object.values(<object>)
এ অন্তর্নির্মিত হবে &
এটি সমর্থন করার জন্য সমস্ত ব্রাউজার অপেক্ষা না করা পর্যন্ত আপনি এটিকে কোনও ফাংশনের অভ্যন্তরে আবদ্ধ করতে পারেন:
Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k])
তারপরে:
Object.vals({lastname:'T',firstname:'A'})
// ['T','A']
অবজেক্ট.এন্ট্রিগুলি এটি আরও ভাল উপায়ে করে।
var dataObject = {"a":{"title":"shop"}, "b":{"title":"home"}}
Object.entries(dataObject).map(itemArray => {
console.log("key=", itemArray[0], "value=", itemArray[1])
})
const myObj = { a:1, b:2, c:3 }
সমস্ত মান পান:
সংক্ষিপ্ততম উপায়:
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
মধ্যে ECMAScript5 ব্যবহার
keys = Object.keys(object);
অন্যথায় আপনি যদি ব্রাউজার এটি সমর্থন না করে তবে সুপরিচিত ব্যবহার করুন for..in loop
for (key in object) {
// your code here
}
object[key]
মানগুলি একটি লুপে পেতে সক্ষম হন ।
for..in
(এবং hasOwnProperty) যাতে এটা সত্যিই তা বৃদ্ধি পায় না .. আমি যে এর নাম ECMAScript 5 ম সংজ্ঞায়িত ইচ্ছুক Object.pairs
(এবং Object.items
জন্য [[key, value], ..]
), কিন্তু হায়, এটা না।
এখন আমি ডোজো টুলকিট ব্যবহার করি কারণ পুরানো ব্রাউজারগুলি সমর্থন করে না Object.values
।
require(['dojox/lang/functional/object'], function(Object) {
var obj = { key1: '1', key2: '2', key3: '3' };
var values = Object.values(obj);
console.log(values);
});
আউটপুট:
['1', '2', '3']