ऑब्जेक्ट की कुंजियों का सरणी प्राप्त करें


371

मैं एक सरणी के रूप में जावास्क्रिप्ट ऑब्जेक्ट की कुंजी प्राप्त करना चाहूंगा, या तो jQuery या शुद्ध जावास्क्रिप्ट में।

क्या इससे कम क्रिया तरीका है?

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
    keys.push(key);
}

4
जोड़ने के अलावा if(foo.hasOwnProperty(key)), कि मैं क्या करूँगा। या, उपयोग करें $.map
रॉकेट हज़मत

10
ओह, पाइथोनिक वन-लाइनर के लिए, हालांकि ...
रिचर्ड

एक पुराना सवाल तो एक पूर्ण उत्तर के लायक नहीं है, लेकिन उन लोगों के लिए जो फिडेल करना चाहते हैं ... jsfiddle.net/LR5D9/3 यह समाधान for var in xलूप को
गड़बड़ाने वाले

जवाबों:


618

उपयोग करें Object.keys:

var foo = {
  'alpha': 'puffin',
  'beta': 'beagle'
};

var keys = Object.keys(foo);
console.log(keys) // ['alpha', 'beta'] 
// (or maybe some other order, keys are unordered).

यह एक ES5 फीचर है। इसका मतलब है कि यह सभी आधुनिक ब्राउज़रों में काम करता है लेकिन यह लीगेसी ब्राउज़र में काम नहीं करेगा

ईएस 5-शिम का एक कार्यान्वयन है Object.keysजिसे आप चुरा सकते हैं


5
नोट: यह केवल आधुनिक ब्राउज़रों पर काम करता है (इसका मतलब है कि मैं IE <9 नहीं)।
रॉकेट हज़मत

2
और मोबाइल ब्राउज़र के बारे में क्या?
मार्वेन ट्रेबेल्सी

1
@SmartyTwiti: मुझे यकीन नहीं है। मुझे लगता है कि यह क्रोम या फ़ायरफ़ॉक्स की तरह है।
रॉकेट हज़मत

एमडीएन में भी उपरोक्त संदर्भित पॉलीफ़िल है, लेकिन आईई 7 और शायद 8 में बग नोट करता है, फिर यहां एक बहुत छोटे पॉलीफ़िल
2012

तो ES5 से पहले किसी ने ऐसा कैसे किया?
एंड्रयू एस

59

आप jQuery का उपयोग कर सकते हैं $.map

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' },
keys = $.map(foo, function(v, i){
  return i;
});

या each, यदि आप उनके साथ कुछ कर रहे हैं। $.each(foo, function(index, value){/* do something with index */});
क्रिस

33

बेशक, एक वस्तु की कुंजी प्राप्त करने Object.keys()का सबसे अच्छा तरीका है। यदि यह आपके वातावरण में उपलब्ध नहीं है, तो यह आपके उदाहरण के रूप में कोड का उपयोग करके तुच्छ रूप से चमकाया जा सकता है (सिवाय इसके कि आपको अपने लूप को ध्यान में रखना होगा, प्रोटोटाइप श्रृंखला के सभी गुणों के विपरीत, Object.keys()'s व्यवहार के विपरीत )।

हालाँकि, आपका उदाहरण कोड ...

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
    keys.push(key);
}

jsFiddle

... संशोधित किया जा सकता है। आप कार्य को चर भाग में कर सकते हैं ।

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [], i = 0;
for (keys[i++] in foo) {}

jsFiddle

बेशक, यह व्यवहार Object.keys()वास्तव में क्या करता है ( jsFiddle ) के लिए अलग है । आप एमडीएन प्रलेखन पर केवल शिम का उपयोग कर सकते हैं ।


8
मुझे यह var keys = [], i = 0; for (keys[i++] in foo) {}+1
जशवंत

मैंने सुना है कि "के लिए" आदेश की गारंटी नहीं देता है, क्या आप जानते हैं कि Object.keys करता है?
क्रिस स्टीफंस

@ChrisStephens न तो गारंटी आदेश देता है, भले ही चाबियाँ एक क्रमबद्ध सरणी में हो।
एलेक्स

2
इन सभी समाधानों को एक hasOwnProperty()जांच की आवश्यकता है , निश्चित रूप से?
unsynchronized

1
@TIMINeutron कोई कारण नहीं है कि यह :) नहीं होना चाहिए
एलेक्स

7

मैं कम क्रिया के बारे में नहीं जानता, लेकिन मुझे वन-लाइनर अनुरोध द्वारा निम्नलिखित पर एक पंक्ति में जोर देने के लिए प्रेरित किया गया था, पता नहीं है कि पाइथोनिक हालांकि यह कैसे है;)

var keys = (function(o){var ks=[]; for(var k in o) ks.push(k); return ks})(foo);

3
हो सकता है कि var enumerableKeysOnThePrototypeChain;)
एलेक्स

1
हो सकता है कि हम यह जानने के लिए पर्याप्त स्मार्ट हों कि हमें hasOwnProperty के बारे में चिंता करने की ज़रूरत नहीं है, अगर वस्तु पूरी तरह से हमारे दायरे में बनाई गई है ताकि कहीं और से आयात किए जाने का विरोध किया जाए
डेक्सिजन

@ एलेक्स के दूसरे उत्तर ( for (keys[i++] in foo) {}) के रूप में अजगर के रूप में नहीं , हालांकि, क्योंकि आप अभी भी प्रदर्शन कर रहे हैं Array.push()(पूरे समारोह की घोषणा करने का उल्लेख नहीं)। एक pythonic कार्यान्वयन जितना संभव हो सके निहितार्थ पर निर्भर होना चाहिए, और एक लंबर अभिव्यक्ति का उपयोग करते हुए असफल होना चाहिए।
काउबर्ट

4

मामले में आप यहाँ एक फ्लैट सरणी के रूप में एक n- नेस्टेड नेस्टेड ऑब्जेक्ट की कुंजियाँ सूचीबद्ध करने के लिए कुछ ढूंढ रहे हैं:

const getObjectKeys = (obj, prefix = '') => {
  return Object.entries(obj).reduce((collector, [key, val]) => {
    const newKeys = [ ...collector, prefix ? `${prefix}.${key}` : key ]
    if (Object.prototype.toString.call(val) === '[object Object]') {
      const newPrefix = prefix ? `${prefix}.${key}` : key
      const otherKeys = getObjectKeys(val, newPrefix)
      return [ ...newKeys, ...otherKeys ]
    }
    return newKeys
  }, [])
}

console.log(getObjectKeys({a: 1, b: 2, c: { d: 3, e: { f: 4 }}}))


1

सारांश

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

उदाहरण:

const object = {
  a: 'string1',
  b: 42,
  c: 34
};

const keys = Object.keys(object)

console.log(keys);

console.log(keys.length) // we can easily access the total amount of properties the object has

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

इसके साथ मान प्राप्त करना: Object.values()

का पूरक कार्य Object.keys()है Object.values()। यह फ़ंक्शन ऑब्जेक्ट को तर्क के रूप में लेता है और मानों की एक सरणी देता है। उदाहरण के लिए:

const object = {
  a: 'random',
  b: 22,
  c: true
};


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


1

यदि आप अंडरस्कोर का उपयोग करने का निर्णय लेते हैं। तो क्या आप बेहतर करते हैं

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
_.each( foo, function( val, key ) {
    keys.push(key);
});
console.log(keys);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.