हैश की चाबियाँ कैसे खोजें?


178

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

var h = {a:'b',c:'d'}; 

मैं की तरह

var k = h.keys() ; // k = ['a','c']; 

कुछ चाहते हैं यह एक समारोह लिखने के लिए सरल है प्राप्त करने के लिए प्राप्त करने में असमर्थ रहे हैं खुद को आइटम्स पर पुन: सक्रिय करने के लिए और एक सरणी में कुंजियां जोड़ें जो मैं लौटाता हूं, लेकिन क्या ऐसा करने के लिए एक मानक क्लीनर तरीका है?

मुझे लगता है कि यह एक साधारण अंतर्निहित कार्य होना चाहिए जो मुझे याद आया लेकिन मुझे यह नहीं मिला!

  0

मैं है मैं सिर्फ जावास्क्रिप्ट में कूद रहा हूं लेकिन यह पोस्ट आपकी मदद कर सकता है। http://dean.edwards.name/weblog/2006/07/enum/ 20 aug. 082008-08-20 21:47:42

  0

संभावित डुप्लिकेट [ऑब्जेक्ट की चाबियों की सरणी प्राप्त करें] (http://stackoverflow.com/questions/8763125/get-array-of-objects- चाबियाँ) 02 feb. 162016-02-02 13:48:01

+1

कुंजी से मूल्य प्राप्त करने के बारे में क्या? इसके अलावा, हैश में चाबियों की संख्या प्राप्त करना। 10 may. 162016-05-10 19:52:29

  0

2017 उत्तर: ऑब्जेक्ट.कीएस (एच) ऑब्जेक्ट.वैल्यूज़ (एच) 24 may. 172017-05-24 13:29:55

249

आधुनिक जावास्क्रिप्ट में समारोह (ECMAScript 5) नहीं है इस कार्य को करते Object.keys कहा जाता है:

var obj = { "a" : 1, "b" : 2, "c" : 3}; 
alert(Object.keys(obj)); // will output ["a", "b", "c"] 

संगतता विवरण here पाया जा सकता है।

if(!Object.keys) Object.keys = function(o){ 
    if (o !== Object(o)) 
     throw new TypeError('Object.keys called on non-object'); 
    var ret=[],p; 
    for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p); 
    return ret; 
} 
  0

यह अधिक प्राकृतिक नहीं होगा? 'अगर (! object.prototype.keys) Object.prototype.keys = function() { अगर (यह! == ऑब्जेक्ट (यह)) नया टाइप एरर फेंक दें (' ऑब्जेक्ट.कीज गैर-ऑब्जेक्ट पर कॉल किया जाता है '); var ret = [], p; (इसमें पी) यदि (ऑब्जेक्ट.प्रोटोटाइप.hasOwnProperty.call (यह, पी)) ret.push (पी); रिटर्न रिट; } var x = {a: {ए: 1, बी: 2, सी: 3}, बी: {ए: 10, बी: 20}}; अलर्ट (x.a.keys()); ' 22 dec. 112011-12-22 00:44:09

+2

जैसा कि मैं समझता हूं कि यह 'Object.prototype.keys' ऑब्जेक्ट के सभी उप-वर्गों के लिए' कुंजी 'उपलब्ध कराएगा, इसलिए सभी ऑब्जेक्ट्स के लिए। यदि आप ओओपी का उपयोग करने की कोशिश कर रहे हैं तो शायद आप चाहते हैं। वैसे भी यह वास्तव में आपकी आवश्यकताओं पर निर्भर करता है। 22 dec. 112011-12-22 21:12:31

+1

यदि आप mootools का उपयोग करते हैं, तो Object.keys() सभी ब्राउज़रों में उपलब्ध होना चाहिए। 10 sep. 122012-09-10 16:43:47

  0

क्या कोणीय टेम्पलेट्स में इसका उपयोग करने के लिए कुछ भी है? यह आंशिक रूप से वहां काम नहीं कर रहा है। 06 dec. 132013-12-06 14:52:42

  0

मुझे लगता है कि आपको इसे कोड नमूना के साथ अलग प्रश्न के रूप में पूछना चाहिए। 07 dec. 132013-12-07 01:05:41


13

यह सबसे अच्छा तुम कर सकते हैं, के रूप में तक मुझे पता है है ...

var keys = []; 
for (var k in h)keys.push(k); 
+2

यह ऑब्जेक्ट.प्रोटोटाइप के साथ गड़बड़ होने पर भी काम नहीं करता है। 26 jul. 112011-07-26 08:40:14

+4

इसका उपयोग करना बेहतर होगा, और ऑब्जेक्ट.प्रोटोटाइप के साथ "गड़बड़" न करें। ऐसा लगता है कि अगर हम ऑब्जेक्ट.प्रोटोटाइप में चीजें जोड़ते हैं तो सबकुछ टूट जाता है: यह सरणी/ऑब्जेक्ट की चाबियों पर लूप के लिए एक बेहद आम मुहावरे है। 07 may. 122012-05-07 07:59:30


6

मैं तुम्हें में/के लिए उपयोग कर सकते हैं ऑब्जेक्ट के गुणों के माध्यम से लूप है, तो आप कुछ इस तरह कर सकता है विश्वास करते हैं :

function getKeys(h) { 
    Array keys = new Array(); 
    for (var key in h) 
    keys.push(key); 
    return keys; 
} 
  0

यह काम नहीं करता है, एन्नन के उत्तर 26 jul. 112011-07-26 08:39:16


79

ग्राहक ब्राउज़रों के साथ एक बड़ी संगतता की आवश्यकता होती है उत्पादन कोड के लिए मैं अभी भी शिम के साथ ऊपर इवान Nevostruev के जवाब का सुझाव पुराने ब्राउज़र में Object.keys सुनिश्चित करने के लिए। हालांकि, ईसीएमए की नई defineProperty सुविधा का उपयोग करके अनुरोध की गई सटीक कार्यक्षमता प्राप्त करना संभव है।

ECMAScript 5 के रूप में - Object.defineProperty

आप Object.defineProperty() का उपयोग गैर गणनीय गुण परिभाषित करने के लिए कर सकते हैं ECMA5 के रूप में। current compatibility अभी भी वांछित होने के लिए बहुत कुछ है, लेकिन यह अंततः सभी ब्राउज़रों में उपयोग करने योग्य बनना चाहिए। (विशेष रूप से IE8 के साथ वर्तमान असंगति ध्यान दें!)

Object.defineProperty(Object.prototype, 'keys', { 
    value: function keys() { 
    var keys = []; 
    for(var i in this) if (this.hasOwnProperty(i)) { 
     keys.push(i); 
    } 
    return keys; 
    }, 
    enumerable: false 
}); 

var o = { 
    'a': 1, 
    'b': 2 
} 

for (var k in o) { 
    console.log(k, o[k]) 
} 

console.log(o.keys()) 

# OUTPUT 
# > a 1 
# > b 2 
# > ["a", "b"] 

हालांकि, बाद से ECMA5 पहले से ही Object.keys जोड़ा तुम भी उपयोग कर सकते हैं:

Object.defineProperty(Object.prototype, 'keys', { 
    value: function keys() { 
    return Object.keys(this); 
    }, 
    enumerable: false 
}); 

मूल जवाब

Object.prototype.keys = function() 
{ 
    var keys = []; 
    for(var i in this) if (this.hasOwnProperty(i)) 
    { 
    keys.push(i); 
    } 
    return keys; 
} 

संपादित करें: चूंकि यह उत्तर थोड़ी देर के लिए रहा है, इसलिए मैं उपर्युक्त छूटेगा। इसे पढ़ने वाले किसी भी व्यक्ति को इवान नेवोस्ट्रूव के उत्तर को भी नीचे पढ़ना चाहिए।

प्रोटोटाइप फ़ंक्शंस को गैर-गणना करने का कोई तरीका नहीं है जिससे उन्हें हमेशा इन-लूप में बदलना पड़ता है जो hasOwnProperty का उपयोग नहीं करते हैं। मुझे अभी भी लगता है कि अगर ऑब्जेक्ट के प्रोटोटाइप को विस्तारित करना इतना गन्दा नहीं था तो यह जवाब आदर्श होगा।

+9

'hasOwnProperty' को इस ऑब्जेक्ट के प्रोटोटाइप पर गुणों को शामिल नहीं किया गया है, जो जानना उपयोगी है। 13 nov. 092009-11-13 11:09:58

+2

उत्तर स्वीकार किया गया क्योंकि इस तरह मैंने इसे कार्यान्वित करने का अंत किया लेकिन मुझे लगता है कि यह भाषा का एक अंतर्निहित कार्य होना चाहिए था। 29 mar. 112011-03-29 22:16:48

+5

ध्यान दें कि वैश्विक चर बनाने से बचने के लिए आपको "(इसमें var var) ..." का उपयोग करना चाहिए। 13 may. 112011-05-13 12:31:03

+5

मैं ऑब्जेक्ट.प्रोटोटाइप को संशोधित करने से बचूंगा - जैसा कि नीचे एक और टिप्पणीकर्ता है, यह आसानी से उन स्क्रिप्ट को तोड़ सकता है जो जांच करने के बारे में सावधान नहीं हैं .ऑनप्रोपर्टी()। इसके बजाए, कम ओओ-फ्रेंडली तरीके का उपयोग करें: 'कुंजी' फ़ंक्शन को परिभाषित करें यदि यह पहले से मौजूद नहीं है। (फ़ायरफ़ॉक्स और क्रोम दोनों मूल कुंजी() फ़ंक्शन को लागू करते हैं जो ओपी चाहता है - आईई नहीं करता है) 31 may. 112011-05-31 22:08:04

  0

ईसीएमएस्क्रिप्ट 5 में 'ऑब्जेक्ट.प्रोटोटाइप.की' नहीं है। Https://gist.github.com/1034464 11 aug. 112011-08-11 18:35:49

+1

ऑब्जेक्ट.प्रोटोटाइप में कुछ भी जोड़ने का बुरा विचार प्रतीत होता है, क्योंकि यह हर सामान्य पाश को तोड़ता है जैसे: (var k सरणी में) {} या (ऑब्जेक्ट में var k), और यह मुहावरे - हालांकि यह दोषपूर्ण हो सकता है - बेहद आम है। उदाहरण के लिए मैथ्यू डार्विन के उत्तर के अनुसार, यह Google मानचित्र को तोड़ देता है। 07 may. 122012-05-07 08:01:00

  0

यह कई कारणों से जाने का तरीका नहीं है; 1) आपको वास्तव में चीजें 'ऑब्जेक्ट.प्रोटोटाइप' में जोड़ना नहीं चाहिए, और निश्चित रूप से इस तरह से नहीं 2) आपको इवान नेवोस्ट्यूव के उत्तर में उल्लिखित 'ऑब्जेक्ट.की' का उपयोग करना चाहिए 03 sep. 122012-09-03 14:32:07

  0

@ ओलिवर नाइटिंगेल मुझे यकीन नहीं है कि कैसे अपनी टिप्पणी लेने के लिए। मैं पहले से ही अपने उत्तर के * संपादन * भाग में एक ही बात कहता हूं। 10 sep. 122012-09-10 12:15:17


4

मैं जब गूगल मैप्स API v3 के साथ संयोजन के रूप में उपयोग करके उपरोक्त

Object.prototype.keys = function() ... 

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

for (var key in h) ... 

अच्छी तरह से काम करता है।


34

आप इस्तेमाल कर सकते हैं Underscore.js है, जो एक जावास्क्रिप्ट उपयोगिता पुस्तकालय है:

Mozilla site पर भी पिछली संगतता के लिए एक snipped है।

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"] 
  0

ठीक है, यह वास्तव में नहीं पूछा गया था, क्योंकि @Pat एक अंतर्निहित फ़ंक्शन की तलाश में है, लेकिन फिर भी यह एक दिलचस्प लाइब्रेरी है, और यह 'ऑब्जेक्ट.प्रोटोटाइप' 11 aug. 112011-08-11 22:11:34

+2

संशोधित नहीं करता है, मुझे लगता है कि यह बहुत उपयोगी है इन निफ्टी छोटी पुस्तकालयों का उपयोग करने के लिए अपने स्वयं के कार्यान्वयन लिखने की बजाय ... वैसे भी, अधिकांश वास्तविक दुनिया परियोजनाओं में, हम अंडरस्कोर या समकक्ष पुस्तकालयों का उपयोग कर रहे हैं। व्यक्तिगत रूप से, मैं अंडरस्कोर के साथ जाना चाहूंगा। 22 aug. 122012-08-22 20:40:48

  0

'_.keys (obj)। लम्बाई 'यह देखने के लिए कि क्या कोई चाबियाँ हैं या नहीं। 24 sep. 122012-09-24 21:04:50


9

jQuery का उपयोग कर आप इस तरह कुंजी प्राप्त कर सकते हैं ...

var bobject = {primary:"red",bg:"maroon",hilite:"green"}; 
var keys = []; 
$.each(bobject, function(key,val){ keys.push(key); }); 
console.log(keys); // ["primary", "bg", "hilite"] 

या -

var bobject = {primary:"red",bg:"maroon",hilite:"green"}; 
$.map(bobject, function(v,k){return k;}); 

धन्यवाद @pimlottc को

+3

यदि आप इस मार्ग पर जाना चाहते हैं, तो आप 'JQuery.map' का उपयोग भी कर सकते हैं: '$ .map (h, function (v, k) {return k;});' 16 may. 122012-05-16 14:20:10


1

अगर आप पाने के लिए कोशिश कर रहे हैं केवल तत्व ही नहीं बल्कि फ़ंक्शंस नहीं तो यह कोड आपकी मदद कर सकता है

this.getKeys = function() { 

var keys = new Array(); 
for(var key in this) { 

    if(typeof this[key] !== 'function') { 

     keys.push(key); 
    } 
} 
return keys; 

}

इस HashMap के अपने कार्यान्वयन का हिस्सा है और मैं केवल चाबियाँ चाहते हैं, this hashmap उद्देश्य यह है कि कुंजी


38

शामिल आप उपयोग कर सकते Object.keys

Object.keys(h) 
+3

ईसीएमएस्क्रिप्ट 5 में जोड़ा गया है लेकिन चाहिए अब तक के प्रमुख ब्राउज़रों में काम करें 30 aug. 132013-08-30 10:15:00