আমি নামগুলি না জানলে কীভাবে জাভাস্ক্রিপ্ট অবজেক্টের বৈশিষ্ট্যগুলি অ্যাক্সেস করব?


124

বলুন আপনার কাছে একটি জাভাস্ক্রিপ্ট অবজেক্ট রয়েছে:

var data = { foo: 'bar', baz: 'quux' };

আপনি সম্পত্তি নাম দ্বারা বৈশিষ্ট্য অ্যাক্সেস করতে পারেন:

var foo = data.foo;
var baz = data["baz"];

তবে আপনি যদি সম্পত্তিগুলির নাম না জানেন তবে এই মানগুলি পাওয়া সম্ভব? এই বৈশিষ্ট্যগুলির নিরক্ষিত প্রকৃতি কি এগুলি আলাদা করে বলা অসম্ভব করে তোলে?

আমার ক্ষেত্রে আমি বিশেষত এমন পরিস্থিতিটি নিয়ে ভাবছি যেখানে কোনও ফাংশনটির জন্য নাম-মান জোড়গুলির একটি সিরিজ গ্রহণ করা প্রয়োজন, তবে বৈশিষ্ট্যের নাম পরিবর্তন হতে পারে।

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

উত্তর:


144

আপনি এই জাতীয় কীগুলির মাধ্যমে লুপ করতে পারেন:

for (var key in data) {
  console.log(key);
}

এটি "নাম" এবং "মান" লগ করে।

আপনার যদি আরও জটিল অবজেক্টের ধরণ থাকে (মূল প্রশ্নের মতো কেবল একটি সরল হ্যাশ-জাতীয় বস্তু নয়) তবে আপনি কেবলমাত্র অবজেক্টের নিজস্ব কীগুলির মাধ্যমে লুপ করতে চান, যা বস্তুর প্রোটোটাইপের কীগুলির বিপরীতে রয়েছে :

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    console.log(key);
  }
}

আপনি উল্লেখ করেছেন যে, কীগুলি কোনও নির্দিষ্ট ক্রমে থাকার নিশ্চয়তা নেই। এটি নীচের থেকে কীভাবে আলাদা হয় তা নোট করুন:

for each (var value in data) {
  console.log(value);
}

এই উদাহরণটি মানগুলির মাধ্যমে লুপ করে, সুতরাং এটি লগ হবে Property Nameএবং 0। নোট: for eachবাক্য গঠনটি বেশিরভাগ ক্ষেত্রে কেবল ফায়ারফক্সে সমর্থিত তবে অন্যান্য ব্রাউজারগুলিতে নয়।

যদি আপনার টার্গেট ব্রাউজারগুলি ES5 সমর্থন করে বা আপনার সাইটে es5-shim.js(প্রস্তাবিত) অন্তর্ভুক্ত থাকে তবে আপনি এটি ব্যবহার করতে পারেন Object.keys:

var data = { Name: 'Property Name', Value: '0' };
console.log(Object.keys(data)); // => ["Name", "Value"]

এবং এর সাথে লুপ করুন Array.prototype.forEach:

Object.keys(data).forEach(function (key) {
  console.log(data[key]);
});
// => Logs "Property Name", 0

আপনি কি শেষটি শেষ করেছেন এবং বাস্তবে এটি থেকে দূরে সরে গেছেন? ভাল হয়েছে ... =)
নিকেল-

এটি ফায়ারফক্সে রয়েছে ( ডক্স ) তবে ন্যায্য বিষয় যে এটি সর্বজনীন নয়। আমি এই উল্লেখ উত্তর আপডেট করব।
রন ডেভেরা

28
বিটিডাব্লু সতর্কতা জিনিসগুলি ডিবাগ করার জন্য একটি খারাপ উপায়,
কনসোল.লগ

যখন প্রশ্নটি জিজ্ঞাসা করা হয়েছিল তখন এটিই ছিল সেরা উত্তর, তবে আমি চেকমার্কটি অপসারণ করছি কারণ পরে জেএস সংস্করণগুলি আরও ভাল সরঞ্জাম সরবরাহ করেছে।
অ্যাডাম লাসেক

65

জাভাস্ক্রিপ্ট (<ES5) এর পুরানো সংস্করণগুলির জন্য একটি for..inলুপ ব্যবহার করা দরকার :

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    // do something with key
  }
}

ইএস 5 আইজেক্ট.কিজ এবং অ্যারে # এর জন্য পরিচয় করিয়ে দেয় যা এটিকে কিছুটা সহজ করে তোলে:

var data = { foo: 'bar', baz: 'quux' };

Object.keys(data); // ['foo', 'baz']
Object.keys(data).map(function(key){ return data[key] }) // ['bar', 'quux']
Object.keys(data).forEach(function (key) {
  // do something with data[key]
});

ES2017 পরিচয় করিয়ে দেয় Object.valuesএবং Object.entries

Object.values(data) // ['bar', 'quux']
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']]

1
এখন এটি আসলে প্রশ্নের উত্তর দিয়েছে, খুব ভালভাবে সম্পন্ন @ অ্যাডাম লাসেককে।
নিকেল-

'নাম' এবং 'মান' উভয়টিকে অবজেক্ট কী হিসাবে ব্যবহার করা বিভ্রান্তিকর। এই ফাংশনটি কেবলমাত্র তালিকার কীগুলি ফিরিয়ে দেয়, মানগুলি নয়। 1 নাম 1: 'মান 1', নাম 2: 'মান 2' ners নতুনদের জন্য বিভ্রান্তি এড়াতে পারে। Object.keys (ডাটা); // ['name1', 'name2']
জেমস নিকলসন

2
@ জামেসনিচলসন আমি সম্মত, কম বিভ্রান্তির জন্য সম্পাদিত।
আদম লাসেক


4

আপনি প্রায়শই কোনও ভাগের প্রোটোটাইপ পদ্ধতি এবং বৈশিষ্ট্যগুলি বাদ দিয়ে কোনও সামগ্রীর উদাহরণের নির্দিষ্ট বৈশিষ্ট্যগুলি পরীক্ষা করতে চান :

 Obj.prototype.toString= function(){
        var A= [];
        for(var p in this){
            if(this.hasOwnProperty(p)){
                A[A.length]= p+'='+this[p];
            }
        }

    return A.join(', ');
}

3
function getDetailedObject(inputObject) {
    var detailedObject = {}, properties;

    do {
        properties = Object.getOwnPropertyNames( inputObject );
        for (var o in properties) {
            detailedObject[properties[o]] = inputObject[properties[o]];
        }
    } while ( inputObject = Object.getPrototypeOf( inputObject ) );

    return detailedObject;
}

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

var obj = { 'b': '4' }; //example object
var detailedObject = getDetailedObject(obj);
for(var o in detailedObject) {
    console.log('key: ' + o + '   value: ' + detailedObject[o]);
}

1
var obj = {
 a: [1, 3, 4],
 b: 2,
 c: ['hi', 'there']
 }
for(let r in obj){  //for in loop iterates all properties in an object
 console.log(r) ;  //print all properties in sequence
 console.log(obj[r]);//print all properties values
}

যেখানে এই উত্তরটি ওপি-র দ্বারা প্রয়োজনীয় কি তা সরবরাহ করে তবে আপনি কী করছেন এবং ওপি কেন এটি ব্যবহার করবে সে সম্পর্কে তার সামান্য বিবরণ দেওয়া হয়েছে, .hasOwnProperty()কোনও বস্তুর পুনরাবৃত্তি করার জন্য ব্যবহার করার সময়ও ভুলে যাবেন না ।
মুহাম্মদ ওমর আসলাম

ধন্যবাদ, আমি সম্মত হই যে .হসানপ্রপার্টি () বস্তুর পুনরাবৃত্তি করে তবে এটি শর্ত পরীক্ষা করতে পুনরাবৃত্তি করে তবে এটি ব্যবহার করে আমরা কোনও বস্তুর সমস্ত বৈশিষ্ট্য মুদ্রণ করতে পারি না। ভুল হলে আমাকে সংশোধন করুন।
মায়াঙ্ক_ভিকে

hasOwnProperty()পদ্ধতি আয় একটি booleanইঙ্গিত বস্তু নির্দিষ্ট সম্পত্তি আছে কিনা তার নিজস্ব সম্পত্তি হিসেবে (যেমন inheriting থেকে ভিন্ন) । এই উদাহরণটি দেখুন
মুহাম্মদ ওমর আসলাম

1

আপনি অবজেক্ট.কিজ () ব্যবহার করতে পারেন , "যা একটি সাধারণ লুপের সাথে আমরা যেমন পেয়েছি ঠিক একই ক্রমে প্রদত্ত বস্তুর নিজস্ব গণনাযোগ্য সম্পত্তির নামের একটি অ্যারে প্রদান করে" "

আপনি যে কোনও বস্তুর জায়গায় ব্যবহার করতে পারেন stats:

var stats = {
  a: 3,
  b: 6,
  d: 7,
  erijgolekngo: 35
}
/*  this is the answer here  */
for (var key in Object.keys(stats)) {
  var t = Object.keys(stats)[key];
  console.log(t + " value =: " + stats[t]);
}


আপনি আরও ব্যাখ্যা যোগ করতে পারেন?
কিথ পিনসন

Object.keys( stats )[key]কোন মানে নেই, সর্বদা হবে undefined
অ্যাডাম লাসেক

-2
var attr, object_information='';

for(attr in object){

      //Get names and values of propertys with style (name : value)
      object_information += attr + ' : ' + object[attr] + '\n'; 

   }


alert(object_information); //Show all Object

এটি গৃহীত উত্তরের সাথে কিছুই যোগ করে না এবং সম্ভাব্যতম কার্যকর উপায়ে তথ্য উপস্থাপন করে। এবং এটি উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যের জন্য অ্যাকাউন্ট করে না।
অ্যাডাম লাসেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.