सहयोगी सरणी कुंजियों की एक सूची प्राप्त करना


258

मेरे पास जावास्क्रिप्ट में एक सहयोगी सरणी है:

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

मुझे इस शब्दकोश की चाबियाँ कैसे मिलती हैं? यानी मुझे चाहिए

var keys = ["cats", "dogs"];

7 साल बाद संपादित करें: बस शब्दावली को सही करने के लिए - जावास्क्रिप्ट में एक 'साहचर्य सरणी' जैसी कोई चीज नहीं है - यह तकनीकी रूप से सिर्फ एक है objectऔर यह ऑब्जेक्ट कुंजी है जिसे हम चाहते हैं।


लॉश जेएस के साथ सरल तरीका - lodash.com/docs#keys
केमिकल प्रोग्रामर

शब्दावली स्पष्ट करने के लिए धन्यवाद! क्या आप चमकदार लाल रंग की चमचमाती रोशनी में कुछ बड़ा कर सकते हैं?
जो फिलिप्स

@ जब मैं मौका पाऊँगा तो मैं इसे आपके लिए Google में पहला परिणाम
बनाऊँगा

जवाबों:


84

आप उपयोग कर सकते हैं: Object.keys(obj)

उदाहरण:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

ब्राउज़र समर्थन के लिए नीचे संदर्भ देखें। यह फ़ायरफ़ॉक्स 4.20, क्रोम 5, IE9 में समर्थित है। नीचे दिए गए लिंक में एक कोड स्निपेट है जिसे आप Object.keys()अपने ब्राउज़र में समर्थित नहीं होने पर जोड़ सकते हैं ।

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys


मैं इसे अब स्वीकृत उत्तर पर स्विच कर रहा हूं। केवल IE8 अब इसका समर्थन नहीं करता है (जिसके लिए एक पॉलीफ़िल उपलब्ध है। डेवलपर.
mozilla.org/en-US/docs/Web/JavaScript/Reference/…

382

इसे इस्तेमाल करे:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnPropertyकी आवश्यकता है क्योंकि प्रोटोटाइप ऑब्जेक्ट में कुंजियों को सम्मिलित करना संभव है dictionary। लेकिन आप आम तौर पर उन कुंजियों को अपनी सूची में शामिल नहीं करना चाहते हैं।

उदाहरण के लिए, यदि आप ऐसा करते हैं:

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

और फिर एक for...inलूप ओवर करते हैं dictionary, आप प्राप्त करेंगे aऔर b, लेकिन आप भी प्राप्त करेंगे c


जब तक आपको लूप के बाद इसका उपयोग करने की आवश्यकता नहीं है, तब तक "var keys = []" घोषित करने की आवश्यकता नहीं है।
मज़लज़ार

2
@ मज़ारज़ार, आप बेहतर करते हैं या यह एक वैश्विक चर होगा, जो बुरा व्यवहार है।
b00t

@ b00t मैं हालांकि पाश के लिए एक चर के अंदर की घोषणा करके ... यह वैश्विक अंतरिक्ष में सेट नहीं किया जाएगा ... अब आप मुझे शक कर दिया
हे

2
@mzalazar, लेकिन आप इसे ( कुंजियों ) को किसी भी बिंदु पर घोषित नहीं कर रहे हैं यदि आप अभी उपयोग कर रहे हैं keys.push(key);। आप वैश्विक नाम स्थान से केवल (और इस प्रकार इसे घोषित कर रहे हैं) खींच रहे हैं। :)
b00t

183
for (var key in dictionary) {
  // do something with key
}

यह for..in स्टेटमेंट है


1
बस देखा कि "कुत्तों" और ऊपर दिए गए सरणी के बीच अल्पविराम के बजाय एक बृहदान्त्र होना चाहिए। मान लें कि यह प्रतिलेखन के कारण है।
wombleton

68
बहुत महत्वपूर्ण है, dictionary.hasOwnProperty(key)अन्यथा आप प्रोटोटाइप श्रृंखला से तरीकों के साथ समाप्त हो सकते हैं ..
टाइग्रेन

4
एक ही लेख से: एक वस्तु के असंख्य गुणों पर, मनमाने क्रम में । यदि कुंजी क्रम महत्वपूर्ण है, तो आपको कुछ करने की आवश्यकता है जैसे कि उन्हें एक सरणी में धकेलना, उसे छांटना, और फिर छांटे गए सरणी से कुंजी प्राप्त करने के लिए () लूप का उपयोग करना जिसके साथ मूल वस्तु को अनुक्रमित करना है।
mcmlxxxvi

1
बेशक, यह उचित है कि आप डिक्शनरी का उपयोग करके डिक्शनरी का चयन कर सकें। यदि आपको विश्वास है कि ऑब्जेक्ट में प्रोटोटाइप का अभाव है। लेकिन इस संदर्भ में प्रोटोटाइप वंशानुक्रम की संभावना से अवगत होना महत्वपूर्ण है, क्योंकि जावास्क्रिप्ट शब्दकोश वास्तव में ऑब्जेक्ट हैं।
15

16

यदि आप लाइब्रेरी (jQuery, प्रोटोटाइप, आदि) का उपयोग करते हैं, तो बस एक त्वरित टिप्पणी, for..in का उपयोग करने से सावधान रहें, क्योंकि उनमें से अधिकांश निर्मित वस्तुओं (शब्दकोशों सहित) में विधियां जोड़ते हैं।

इसका मतलब यह होगा कि जब आप उन पर लूप करेंगे, तो विधि नाम कुंजियों के रूप में दिखाई देंगे। यदि आप एक पुस्तकालय का उपयोग कर रहे हैं, तो दस्तावेज़ीकरण देखें और एक गणना करने योग्य अनुभाग देखें, जहां आपको अपनी वस्तुओं के पुनरावृत्ति के लिए सही तरीके मिलेंगे।


3

सरल तरीका है।

यह वही है जो मैं
DictionaryOjj का उपयोग करता हूं जो जावास्क्रिप्ट शब्दकोश वस्तु है जिसे आप गुजरना चाहते हैं। मूल्य, कुंजी शब्दकोष में उनके नाम होने की कुंजी।

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
इसके लिए jQuery की आवश्यकता होती है (जो ठीक है) लेकिन आप इसका उल्लेख करना भूल गए हैं :-)
सिमोन_विवर

@Exzile आपके फ़ंक्शन की परिभाषा में तर्क नाम बहुत भ्रमित करने वाले हैं। यह api.jquery.com/jquery.each पर कहता है कि कॉलबैक फंक्शन (स्ट्रिंग प्रॉपर्टीनाम, ऑब्जेक्ट वैल्यूऑफप्रॉपर्टी) है। आपके नाम का अर्थ है उल्टा।
क्रिस

@ क्रिस मैं तुम्हारे लिए है कि अद्यतन करेगा। यह बात बताने के लिए धन्यवाद।
Exzile

0

मैं वर्तमान में रोब डी ला क्रूज़ के उत्तर का उपयोग कर रहा हूं

Object.keys(obj)

और मेरे द्वारा जल्दी लोड की गई एक फ़ाइल में इंटरनेट पर कहीं और से उधार ली गई कोड की कुछ पंक्तियाँ हैं, जो स्क्रिप्ट दुभाषियों के पुराने संस्करणों के मामले को कवर करती हैं, जिनमें Object.keys निर्मित नहीं हैं।

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

मुझे लगता है कि यह बड़ी परियोजनाओं के लिए दोनों दुनिया में सबसे अच्छा है: सरल आधुनिक कोड और ब्राउज़र के पुराने संस्करणों के लिए पीछे की ओर संगत समर्थन आदि।

प्रभावी रूप से यह JW के फ़ंक्शन को फ़ंक्शन में डालता है जब रोब डी ला क्रूज़ ऑब्जेक्ट.आईक्स (obj) मूल रूप से उपलब्ध नहीं होता है।

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