अगर मैं नाम नहीं जानता, तो मैं एक जावास्क्रिप्ट ऑब्जेक्ट के गुणों का उपयोग कैसे करूं?


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। NB: 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

क्या आपने अभी पिछले एक को बनाया है और वास्तव में इसके साथ दूर हो गया है? शाबाश ... =)
निकल- 15

यह फ़ायरफ़ॉक्स ( डॉक्स ) में मौजूद है , लेकिन उचित है कि यह सार्वभौमिक नहीं है। मैं इसका उल्लेख करने के लिए उत्तर को अपडेट करूंगा।
रॉन डेवेरा

28
btw अलर्ट चीजों को डिबग करने का एक बुरा तरीका है, कंसोल की कोशिश करें।
StackOverflowed

यह सबसे अच्छा जवाब था जब सवाल पूछा गया था, लेकिन मैं चेकमार्क हटा रहा हूं क्योंकि बाद में जेएस संस्करणों ने बेहतर उपकरण प्रदान किए हैं।
एडम लाससेक

65

जावास्क्रिप्ट के पुराने संस्करणों (<ES5) को for..inलूप का उपयोग करने की आवश्यकता होती है :

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

ES5 परिचय Object.keys और सरणी # foreach जो इस एक छोटे से आसान बना देता है:

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
अब यह वास्तव में इस सवाल का जवाब देता है, अच्छी तरह से @ अदम लासेक, बहुत अच्छी तरह से किया गया।
निकल- १५'१२

ऑब्जेक्ट कुंजियों के रूप में 'नाम' और 'मान' दोनों का उपयोग करना भ्रामक है। यह फ़ंक्शन केवल सूची में कुंजी देता है, न कि मान। {name1: 'value1', name2: 'value2'} शुरुआती लोगों के लिए भ्रम से बचेंगे। Object.keys (डेटा); // ['name1', 'name2']
जेम्स निकोलसन

2
@JamesNicholson मैं सहमत हूं, कम भ्रमित होने के लिए संपादित किया गया।
एडम लाससेक


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 () वस्तु को पुन: प्रदर्शित करता है, लेकिन यह एक स्थिति की जांच करने के लिए पुनरावृत्त करता है, लेकिन इसका उपयोग करके हम किसी वस्तु के सभी गुणों को प्रिंट नहीं कर सकते हैं। गलत होने पर मुझे सुधारो।
मयंक_ वीके

hasOwnProperty()विधि रिटर्न एक booleanसंकेत वस्तु निर्दिष्ट संपत्ति है या नहीं अपनी ही संपत्ति के रूप में (के रूप में यह इनहेरिट के खिलाफ) । इस उदाहरण को
मुहम्मद ओमर असलम

1

आप Object.keys () का उपयोग कर सकते हैं , "जो किसी दिए गए ऑब्जेक्ट के अपने असंख्य संपत्ति नामों की एक सरणी देता है, उसी क्रम में, जैसा कि हम एक सामान्य लूप के साथ प्राप्त करते हैं।"

आप इसके स्थान पर किसी भी वस्तु का उपयोग कर सकते हैं 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

यह स्वीकृत उत्तर के लिए कुछ भी नहीं जोड़ता है, और जानकारी को कम से कम उपयोगी तरीके से प्रस्तुत करता है। और यह विरासत में मिली संपत्ति के लिए जिम्मेदार नहीं है।
एडम लाससेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.