2012-01-06 20 views
242

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

क्या इससे कम वर्बोज़ तरीका है?

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

'if (foo.hasOwnProperty (key)) जोड़ने के अलावा, मैं यही करता हूं। या, '$ .map' का उपयोग करें। –

+7

ओह पाइथोनिक एक-लाइनर के लिए, हालांकि ... – Richard

+0

एक पुराना सवाल है, इसलिए पूर्ण जवाब के लायक नहीं है, लेकिन उन लोगों के लिए जो बेकार करना चाहते हैं ... http://jsfiddle.net/LR5D9/3/ यह समाधान संबंधित है x' loops में var के लिए 'गड़बड़ाना प्रोटोटाइप घोषणाओं का मुद्दा – unsynchronized

उत्तर

435
var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }; 
var keys = Object.keys(foo); // ['alpha', 'beta'] 
// (or maybe some other order, keys are unordered). 

उपयोग Object.keys

यह एक ईएस 5 सुविधा है। इसका मतलब है कि यह सभी आधुनिक ब्राउज़रों में काम करता है लेकिन will not work in legacy browsers

ES5-शिम है एक implementation of Object.keys you can steal

+5

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

+2

और मोबाइल ब्राउज़र के बारे में क्या? –

+1

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

51

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

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

यह समाधान (रॉकेट) ठीक काम करता है http://jsfiddle.net/KV3RA/3/ – MilkyWayJoe

+2

मुझे लगता है कि यह समाधान ऑब्जेक्ट.की() IE8 में काम नहीं करता है ... – NLemay

5

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

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

हो सकता है कि यह 'var enumerableKeysOnThePrototypeChain' होना चाहिए;) – alex

+1

हो सकता है कि हम यह जान सकें कि हमें हैऑनप्रोपर्टी के बारे में चिंता करने की ज़रूरत नहीं है अगर ऑब्जेक्ट पूरी तरह से हमारे अधिकार के तहत बनाया गया है क्योंकि कहीं और –

+0

से आयात किया जा रहा है @ एलेक्स के दूसरे उत्तर के रूप में पायथनिक ('के लिए (कुंजी में [चाबियाँ [i ++]) {} ') हालांकि, क्योंकि आप अभी भी' Array.push()' प्रदर्शन कर रहे हैं (पूरे फ़ंक्शन को घोषित करने का उल्लेख नहीं करना)। एक पाइथोनिक कार्यान्वयन जितना संभव हो उतना अंतर्निहित समझ पर भरोसा करना चाहिए, और लैम्ब्डा अभिव्यक्ति का उपयोग करके इसे विफल करना चाहिए। – cowbert

22
बेशक

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

हालांकि

, अपने उदाहरण कोड ...

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) से अलग है। आप बस shim on the MDN documentation का उपयोग कर सकते हैं।

+7

मुझे यह 'var keys = [], i = 0 पसंद आया; (कुंजी में [i ++] foo में) {} '+1 – Jashwant

+0

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

+0

@ChrisStephens न तो गारंटी आदेश, भले ही कुंजी ऑर्डर किए गए सरणी में हो। – alex

संबंधित मुद्दे