जावास्क्रिप्ट ऑब्जेक्ट की पहली संपत्ति तक कैसे पहुंचें?


610

क्या किसी वस्तु की पहली संपत्ति तक पहुंचने का एक सुंदर तरीका है ...

  1. जहां आपको अपने गुणों का नाम नहीं पता है
  2. जैसे for .. injQuery का एक लूप का उपयोग किए बिना$.each

उदाहरण के लिए, मुझे foo1foo1 का नाम जाने बिना ऑब्जेक्ट को एक्सेस करने की आवश्यकता है :

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

1
संभवतः इसे पहले ऐरे में बदलना बेहतर है
क्रैगॉक्स

जवाबों:


1391
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

इसके उपयोग से आप अनुक्रमणिका द्वारा अन्य गुणों को भी एक्सेस कर सकते हैं। जागरूक रहो! Object.keysECMAScript के अनुसार रिटर्न ऑर्डर की गारंटी नहीं है, लेकिन अनौपचारिक रूप से यह सभी प्रमुख ब्राउज़रों के कार्यान्वयन द्वारा है, कृपया इस पर विवरण के लिए https://stackoverflow.com/a/23202095 पढ़ें ।


25
आप कहते हैं कि यह सबसे तेज़ तरीका नहीं है। क्या रास्ता तेज होगा?
टी गुयेन

3
यह बहुत कुशल नहीं है क्योंकि यह ऑब्जेक्ट की सभी चाबियों का एक पूरा सरणी बनाता है।
एंड्रयू माओ

9
@T गुयेन मैं इसे पोस्ट होगा अगर मैं यह जानता था :)
Grzegorz Kaczan

5
@DavChana - आपने अपना बेंचमार्क गलत किया था। बॉयलरप्लेट ब्लॉक हमेशा निष्पादित किया जाएगा और अपने ब्लॉक 2 खाली था, पहला परिणाम अर्थ निष्पादन का प्रतिनिधित्व करता है बॉयलरप्लेट + block1 , और दूसरा परिणाम केवल प्रतिनिधित्व करता बॉयलरप्लेटयहाँ सही बेंचमार्क है: http://jsben.ch/#/R9aLQ , यह दिखाते हैं कि वे बहुत अधिक समान हैं (कई बार परीक्षण चलाते हैं)।
14 अक्टूबर को myfunkyside

9
मैं कामना करता हूं first()या कुछ इसी तरह से इसे संभाल सकता हूं ।
Fr0zenFyr

113

पहले पुनरावृत्ति के बाद for … inलूप और ब्रेक की कोशिश करें :

for (var prop in object) {
    // object[prop]
    break;
}

1
मुझे लगता है कि यह एकमात्र विकल्प के बारे में है। मुझे यकीन नहीं है कि आपको गारंटी दी गई है कि संपत्तियों को एक अनुमानित / उपयोगी क्रम में पुनरावृत्त किया जाएगा। यानी, आप foo1 का इरादा कर सकते हैं लेकिन foo3 प्राप्त करें। यदि गुणों को उदाहरण के रूप में गिना जाता है, तो आप '1' में समाप्त होने वाले पहचानकर्ता का पता लगाने के लिए एक तार की तुलना कर सकते हैं। फिर, यदि अध्यादेश संग्रह की मुख्य चिंता है, तो आपको संभवतः एक वस्तु के बजाय एक सरणी का उपयोग करना चाहिए।
स्टीमर 25

2
यदि किसी और के आदेश के बारे में चिंतित हैं, तो अधिकांश ब्राउज़र अनुमान लगाते हैं: stackoverflow.com/questions/280713/…
फ्लैश

6
var प्रोप; के लिए (वस्तु में प्रोप) तोड़; // ऑब्जेक्ट [प्रोप]
netiul

12
पुराना उत्तर लेकिन आप जाँच सकते हैं कि क्या संपत्ति ऑब्जेक्ट से संबंधित है। जैसे: (..) {अगर (! obj.hasOwnProperty (प्रोप)) जारी है; .... टूटना; } यदि वस्तु वास्तव में खाली है तो यह प्रोटोटाइप या किसी चीज का पता नहीं लगाती है।
pgarciacamou

65

आप यह भी कर सकते हैं Object.values(example)[0]


यह सभी ब्राउज़रों में उपलब्ध नहीं है,
जिसका

1
मुझे इससे बेहतर पसंद है Object.keys, क्योंकि आपको पहली वस्तु प्राप्त करने की गारंटी है।
TheUtherSide

2019 से अपडेट करें, मुझे लगता है कि IE डेवलपर.
mozilla.org/en-US/docs/Web/JavaScript/Reference/…

46

Object.keysकिसी ऑब्जेक्ट पर गुणों की एक सरणी प्राप्त करने के लिए उपयोग करें । उदाहरण:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable)

दस्तावेज़ीकरण और क्रॉस-ब्राउज़र शिम यहां उपलब्ध कराया गया है । इसके उपयोग का एक उदाहरण यहां मेरे एक अन्य उत्तर में पाया जा सकता है

संपादित करें : स्पष्टता के लिए, मैं सिर्फ यह प्रतिध्वनित करना चाहता हूं कि अन्य उत्तरों में सही ढंग से क्या कहा गया था: जावास्क्रिप्ट वस्तुओं में प्रमुख क्रम अपरिभाषित है।


25

एक-नियम संस्करण:

var val = example[function() { for (var k in example) return k }()];

2
कभी-कभी यह for inजाँच के बिना उपयोग करने के लिए जोखिम भरा हो सकता है hasOwnPropertyक्योंकि ऑब्जेक्ट में अन्य अवांछित मान हैं जो इसे प्रोग्रामेटिक रूप से जोड़ते हैं ताकि आप इस स्निपेट से अवांछित परिणाम प्राप्त कर सकें। सिर्फ इसलिए कि इसका छोटा और साफ-सुथरा मतलब इसका सुरक्षित इष्टतम नहीं है।
जेवियर कोबोस

24

"प्रथम" संपत्ति नहीं है। ऑब्जेक्ट कुंजी अनियंत्रित हैं।

यदि आप उनके लिए उनके साथ लूप करते हैं तो आप (var foo in bar)उन्हें किसी क्रम में प्राप्त करेंगे , लेकिन यह भविष्य में बदल सकता है (विशेषकर यदि आप अन्य कुंजियों को जोड़ते या हटाते हैं)।


बहुत बढ़िया। मैं एक नक्शे को लागू करने के लिए एक ऑब्जेक्ट का उपयोग कर रहा हूं जो प्रविष्टि क्रम को बनाए रखता है। एक बार जब मैं एक मूल्य निकालता हूं तो टूट जाता है क्योंकि अगला सम्मिलन अंतराल में भर जाता है। :(
डेविड हार्कस ने

2
जेएस के नए संस्करणों में कुंजी / मूल्य आदेश संरक्षित किया जाना चाहिए
अलेक्जेंडर मिल्स

11

लॉश लाइब्रेरी के साथ समाधान :

_.find(example) // => {name: "foo1"}

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


2
बस यह परीक्षण किया है, और यह काम नहीं करता है। यह केवल मूल्य देता है, कुंजी / मूल्य जोड़ी नहीं।
क्रिस हैन्स

2
इस प्रश्न में कोई उल्लेख नहीं है कि यह कुंजी / मूल्य जोड़ी को वापस करना चाहिए, वह सिर्फ ऑब्जेक्ट के लिए पूछता है और स्वीकृत उत्तर केवल इस दर्ज कार्य को उतना ही करता है: यह पहली संपत्ति की सामग्री को लौटाता है। यह आपकी विशिष्ट आवश्यकताओं के अनुरूप नहीं हो सकता है, लेकिन मूल प्रश्न के आधार पर यह उत्तर सही है।
कैरम

हाँ, काम करता है, उपयोगी जब आप जानते हैं कि आपकी वस्तु केवल एक बच्चे की वस्तु होगीvar object = { childIndex: { .. } }; var childObject = _.find(Object);
राजा खुर्री

9

कोई वस्तु शाब्दिक, जैसा कि MDC द्वारा परिभाषित है:

घुंघराले ब्रेसिज़ ({}) में संलग्न संपत्ति के नाम और संबंधित मूल्यों के शून्य या अधिक जोड़े की एक सूची।

इसलिए एक ऑब्जेक्ट शाब्दिक एक सरणी नहीं है, और आप केवल उनके स्पष्ट नाम या कीवर्ड forका उपयोग करके लूप का उपयोग करके गुणों तक पहुंच सकते हैं in


25
इस उत्तर पर केवल हरे रंग की टिक देखने वाले अन्य लोगों के लिए, पृष्ठ के नीचे एक और समाधान है जिसमें वर्तमान में 350 अपवोट हैं।
redfox05

7

शीर्ष उत्तर पूरे सरणी को उत्पन्न कर सकता है और फिर सूची से कैप्चर कर सकता है। यहां एक और प्रभावी शॉर्टकट है

var obj = { first: 'someVal' };
Object.entries(obj)[0][1] // someVal

3

यह पहले भी यहां कवर किया जा चुका है।

पहले की अवधारणा वस्तु गुणों पर लागू नहीं होती है, और एक के लिए ... के लूप में चश्मा की गारंटी नहीं है, हालांकि व्यवहार में यह क्रोम ( बग रिपोर्ट ) के लिए गंभीर रूप से सिवाय FIFO के है । तदनुसार अपने निर्णय लें।


3

मैं आपको पुराने IE संस्करणों में समर्थित नहीं होने के बाद से Object.keys का उपयोग करने की सलाह नहीं देता। लेकिन अगर आपको वास्तव में इसकी आवश्यकता है, तो आप वापस संगतता की गारंटी के लिए ऊपर दिए गए कोड का उपयोग कर सकते हैं:

if (!Object.keys) {
Object.keys = (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
    hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
    dontEnums = [
      'toString',
      'toLocaleString',
      'valueOf',
      'hasOwnProperty',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'constructor'
    ],
    dontEnumsLength = dontEnums.length;

return function (obj) {
  if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

  var result = [];

  for (var prop in obj) {
    if (hasOwnProperty.call(obj, prop)) result.push(prop);
  }

  if (hasDontEnumBug) {
    for (var i=0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
    }
  }
  return result;
}})()};

फ़ीचर फ़ायरफ़ॉक्स (गेको) 4 (2.0) क्रोम 5 इंटरनेट एक्सप्लोरर 9 ओपेरा 12 सफारी 5

अधिक जानकारी: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

लेकिन अगर आपको केवल पहले एक की आवश्यकता है, तो हम एक छोटे समाधान की व्यवस्था कर सकते हैं:

var data = {"key1":"123","key2":"456"};
var first = {};
for(key in data){
    if(data.hasOwnProperty(key)){
        first.key = key;
        first.content =  data[key];
        break;
    }
}
console.log(first); // {key:"key",content:"123"}

2

जिस ऑब्जेक्ट का आप उपयोग कर सकते हैं उसमें पहला मुख्य नाम पाने के लिए:

var obj = { first: 'someVal' };
Object.keys(obj)[0]; //returns 'first'

एक स्ट्रिंग लौटाता है, इसलिए यदि आप इस तरह थे, तो नेस्टेड वस्तुओं तक पहुंच नहीं सकते:

var obj = { first: { someVal : { id : 1} }; उस समाधान के साथ आप आईडी तक नहीं पहुंच सकते।

यदि आप वास्तविक वस्तु प्राप्त करना चाहते हैं तो सबसे अच्छा समाधान है जैसे कि लश का उपयोग करना:

obj[_.first(_.keys(obj))].id

पहली कुंजी के मूल्य को वापस करने के लिए, (यदि आप वास्तव में पहली कुंजी का नाम नहीं जानते हैं):

var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

यदि आपको मुख्य नाम का उपयोग करना पता है:

obj.first

या

obj['first']

0

यदि आपको "किसी ऑब्जेक्ट की पहली संपत्ति" तक पहुंचने की आवश्यकता है, तो इसका मतलब यह हो सकता है कि आपके तर्क में कुछ गड़बड़ है। किसी वस्तु के गुणों का क्रम मायने नहीं रखता।


आप सही हे। मुझे पहले वाले की जरूरत नहीं है, प्रति se की, लेकिन सिर्फ एक foo प्रॉपर्टीज की है ताकि मैं इसके साथ काम कर सकूं। मुझे केवल एक की आवश्यकता है और यह निश्चित नहीं था कि क्या बिना "प्रथम" को हथियाने के लिए एक तरीका था ... के लिए।
atogle

0

ऑब्जेक्ट (चौकोर कोष्ठक) के बजाय एक सरणी का उपयोग करें।

var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}];
var fist = example[0];

ध्यान दें कि आप 'फू' पहचानकर्ताओं को खो देते हैं। लेकिन आप निहित वस्तुओं में एक नाम संपत्ति जोड़ सकते हैं:

var example = [ 
  {name: 'foo1', /* stuff1 */},
  {name: 'foo2', /* stuff2 */},
  {name: 'foo3', /* stuff3 */}
];
var whatWasFirst = example[0].name;

ऐसी स्थितियां हैं जिनमें हम नहीं कर सकते। हम मान रहे हैं कि हम इस तथ्य को नहीं बदल सकते कि वे एक सरणी में नहीं हैं
1mike12

1
मुझे लगता है कि पाठकों के लिए डिज़ाइन पर थोड़ा पीछे जाना उपयोगी है जो उनके JSON स्कीमा को नियंत्रित कर सकते हैं। अनिवार्य रूप से, मैं कुछ उदाहरणों के साथ फ्लेवियस स्टेफ के उत्तर का विस्तार कर रहा हूं।
स्टीमर 25


0

आप उपयोग कर सकते हैं Object.prototype.keysजो एक ही क्रम में एक वस्तु की सभी चाबियाँ लौटाता है। इसलिए यदि आप चाहते हैं कि पहली वस्तु बस उस सरणी को प्राप्त करें और वांछित कुंजी के रूप में पहले तत्व का उपयोग करें।

const o = { "key1": "value1", "key2": "value2"};
const idx = 0; // add the index for which you want value
var key = Object.keys(o)[idx];
value = o[key]
console.log(key,value); // key2 value2

1
एक पुराने प्रश्न का उत्तर देते समय, आपका उत्तर अन्य StackOverflow उपयोगकर्ताओं के लिए अधिक उपयोगी होगा यदि आपने यह समझाने के लिए कुछ संदर्भ शामिल किए कि आपका उत्तर कैसे मदद करता है, विशेष रूप से उस प्रश्न के लिए जो पहले से ही स्वीकृत उत्तर है। देखें: कैसे मैं एक अच्छा जवाब लिख सकता हूं
डेविड बक 12

0

हम भी इस दृष्टिकोण के साथ कर सकते हैं।

var example = {
  foo1: { /* stuff1 */},
  foo2: { /* stuff2 */},
  foo3: { /* stuff3 */}
}; 
Object.entries(example)[0][1];

0

यहाँ पहली कुंजी प्राप्त करने का एक क्लीनर तरीका है:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

var object2 = {
    needThis: 'This is a value of the property',
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

let [first] = Object.keys(example)
let [firstProp] = Object.keys(object2)

console.log(first)
//Prop : needThis, Value: This is a value of the property
console.log(`Prop : ${firstProp}, Value: ${object2[firstProp]}`)


लेकिन चारों ओर सरणी क्यों [first]। उपयोगकर्ता ने उत्तर के रूप में एक सरणी का अनुरोध नहीं किया। ऐसा क्यों करें first = Object.keys(example)[0]जो एक सरणी में उत्तर को लपेटने की आवश्यकता के बिना भी ऐसा ही करेगा। आपका क्लीनर कृपया क्यों है?
माइकल डुरंट

यह एक विनाशकारी असाइनमेंट डेवलपर है।
pmillailla.org/en-US/docs/Web/JavaScript/Reference/…
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.