अनुक्रमणिका द्वारा गैर-संख्यात्मक ऑब्जेक्ट गुण तक पहुँचें?


88

अगर मेरे पास इस तरह से एक सरणी है:

var arr = ['one','two','three'];

मैं ऐसा करके विभिन्न भागों तक पहुँच सकता हूँ:

console.log(arr[1]);

मैं कुंजी के बजाय उनके आदेश द्वारा वस्तु गुणों तक कैसे पहुंच सकता हूं?

उदाहरण:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

मैं प्रत्येक ऑब्जेक्ट के लिए पहली संपत्ति कैसे प्राप्त objकरूंगा- "से" और "इवनमोर" से jbo- संपत्ति के नाम का स्पष्ट रूप से उपयोग करके?

अब, आप में से कुछ लगता है कि मैं कुछ के बाद कर रहा हूँ:

console.log(obj['something']);

यह मामला नहीं है, मैं विशेष रूप से पहले उदाहरण की तरह, सूचकांक को लक्षित करने के लिए देख रहा हूं - यदि यह संभव है।


2
आपको "ऑब्जेक्ट एरे" से क्या मतलब है। एक सरणी है एक वस्तु। क्या आपका मतलब सिर्फ एक वस्तु है जो एक सरणी नहीं है, या क्या आप वस्तुओं की एक सरणी का मतलब है। और आपके प्रश्न में jQuery का कारक कैसे है? आपका एकमात्र कोड उदाहरण उस हिस्से को दिखाता है जिसे आप पहले से जानते हैं कि कैसे करना है। कैसे कुछ कोड देने के बारे में जो समस्या को दिखाता है
user113716

@ Ged _._ Ӫ जिस कारण से मैंने jQuery को टैग किया है वह एक व्यापक दर्शक प्राप्त करने के लिए है, मुझे लगा कि जो कोई भी jQuery जानता है उसे सरणी की समझ होनी चाहिए, मेरे प्रश्न का खंडन नहीं करना, यह पाठ्यपुस्तक का सामान है।
डेरिल

4
वास्तव में मैं कहूंगा कि अधिक लोग "jQuery" को जानते हैं और जावास्क्रिप्ट को इसके विपरीत नहीं जानते हैं (कम से कम ऐसे लोग जो जावास्क्रिप्ट को जानते हैं उन्हें आसानी से jQuery को समझने में सक्षम होना चाहिए) .... और आपके वास्तविक प्रश्न के संबंध में: नहीं, आप अनुक्रमणिका द्वारा objec गुणों तक नहीं पहुँच सकते। उन्हें आदेश नहीं दिया जाता है।
फेलिक्स क्लिंग

2
"... मुझे लगा कि जो कोई भी jQuery जानता है उसे सरणी की समझ होनी चाहिए ..." मैं इस पर दांव नहीं लगाऊंगा।
user113716

1
@Brogrammer: इस सवाल का jQuery से कोई लेना-देना नहीं है, इसलिए jQuery टैग अनुचित है।
आउट्स

जवाबों:


125

"मैं विशेष रूप से पहले उदाहरण की तरह, सूचकांक को लक्षित करने के लिए देख रहा हूं - यदि यह संभव है।"

नहीं, यह संभव नहीं है।

निकटतम आप प्राप्त कर सकते हैं ऑब्जेक्ट की कुंजियों का एक सरणी प्राप्त करना है, और इसका उपयोग करना है:

var keys = Object.keys( obj );

... लेकिन इस बात की कोई गारंटी नहीं है कि आपके द्वारा परिभाषित क्रम में चाबियाँ वापस आ जाएंगी। तो यह अंत की तरह लग सकता है:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'

6
Object.keys()यदि आप ऑब्जेक्ट की सामग्री जानते हैं तो मज़बूती से इस्तेमाल किया जा सकता है। यहाँ और अधिक विस्तार: stackoverflow.com/questions/280713/…
क्रोनोकली

3
Object.keys () विधि किसी दिए गए ऑब्जेक्ट के स्वयं के असंख्य गुणों की एक सरणी देती है, उसी क्रम में जो एक के लिए प्रदान की जाती है ... लूप में (अंतर यह है कि फॉर-इन लूप प्रोटोटाइप श्रृंखला में गुणों की गणना करता है। कुंआ)। developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
अमृत ​​रागे

6
सब कुछ संभव है
Cas Bloem

48

एकमात्र तरीका मैं ऐसा करने के बारे में सोच सकता हूं, एक ऐसा तरीका है जो आपको संपत्ति का उपयोग करके देता है Object.keys();

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

डेमो: http://jsfiddle.net/UmkVn/

इसका उपयोग करना सभी वस्तुओं तक विस्तारित करना संभव होगा, Object.prototype;लेकिन यह आमतौर पर अनुशंसित नहीं है।

इसके बजाय, एक फ़ंक्शन सहायक का उपयोग करें:

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6

1
यह शांत है और एक आकर्षण की तरह काम करता है! यह स्वीकृत उत्तर क्यों नहीं है? आपको संभवतः return this[Object.keys(this)[n]];इसे सामान्य बनाने के लिए उपयोग करना चाहिए ।
क्रोनोकली

3
हैलो 2016 से, हम भविष्य के लोक अभी भी सोचते हैं कि यह स्वीकृत उत्तर होना चाहिए। महान समाधान
mhodges

इसका कारण यह है कि स्वीकृत उत्तर नहीं है क्योंकि es6 तक, Object.keys के आदेश की गारंटी नहीं है। इसलिए, भले ही वह कोड कुछ JS इंजनों में काम करता हो, लेकिन उन सभी में काम करने की गारंटी नहीं है। stackoverflow.com/questions/5525795/…
ptoinson

13

Object.values()यदि आप उपयोग नहीं करना चाहते हैं तो आप इस विधि का उपयोग कर सकते हैं Object.keys()

उस Object.keys()विधि के विपरीत, जो किसी दिए गए ऑब्जेक्ट के स्वयं के असंख्य गुणों की एक सरणी लौटाती है, इसलिए उदाहरण के लिए:

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

निम्न सरणी का प्रिंट आउट लेगा:

[ 'a', 'b', 'c' ]

Object.values()विधि एक दिए गए वस्तु की अपनी गणनीय संपत्ति की एक सरणी देता है values

इसलिए यदि आपके पास एक ही वस्तु है, लेकिन इसके बजाय मूल्यों का उपयोग करें,

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

आपको निम्न सरणी मिलेगी:

[ 'somestring', 42, false ]

इसलिए यदि आप एक्सेस करना चाहते हैं object1.b, लेकिन एक इंडेक्स का उपयोग करने के बजाय आप उपयोग कर सकते हैं:

Object.values(object1)[1] === 42

आप यहाँ इस विधि के बारे में अधिक पढ़ सकते हैं ।


1
इस विषय में सुझाई गई यह विधि सबसे छोटी और सबसे सुंदर लगती है।
पेट्रो

5
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

संपादित करें:

"मैं विशेष रूप से पहले उदाहरण की तरह, सूचकांक को लक्षित करने के लिए देख रहा हूं - यदि यह संभव है।"

वास्तव में 'इंडेक्स ’प्रमुख है। यदि आप एक कुंजी की स्थिति को संग्रहीत करना चाहते हैं तो आपको इसे संभालने के लिए एक कस्टम ऑब्जेक्ट बनाने की आवश्यकता है।


मुझे पता है कि आप इसे कुंजी द्वारा एक्सेस कर सकते हैं, यही वह नहीं है जो मैं पूछ रहा था।
डेरिल

@Brogrammer: आपका प्रश्न अस्पष्ट है, इसलिए यह पोस्ट लिखित रूप में प्रश्न का उत्तर देती है।
आउट्स


2

कुंजियों की सरणी प्राप्त करें, इसे उल्टा करें, फिर अपना लूप चलाएं

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }

1

आप एक ऐसा सरणी बना सकते हैं जो आपके ऑब्जेक्ट फ़ील्ड से भरा हो और एरे पर एक इंडेक्स का उपयोग करें और उसके माध्यम से ऑब्जेक्ट प्रॉपर्टी को एक्सेस करें

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]

1

मैंने आगे बढ़कर आपके लिए एक समारोह बनाया:

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

let obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
};

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"


1
क्या आप बता सकते हैं कि आपके दृष्टिकोण में क्या किया जा रहा है?
राहुल भोबे

मैंने कोड में कुछ टिप्पणियां जोड़ीं, ताकि आप समझ सकें कि क्या किया जा रहा है।
स्टैकगीक

0

यदि आप सुनिश्चित नहीं हैं कि Object.keys () आपको सही क्रम में चाबियाँ वापस करने जा रहा है, तो आप इस तर्क को इसके बजाय आज़मा सकते हैं

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.