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


192

मैं जावास्क्रिप्ट वस्तुओं को हैश के रूप में दोगुना जानता हूं, लेकिन मैं चाबियों को प्राप्त करने के लिए निर्मित फ़ंक्शन को खोजने में असमर्थ रहा हूं

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

मुझे कुछ ऐसा चाहिए

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

आइटम पर पुनरावृति करने के लिए एक फ़ंक्शन को लिखना आसान है और एक सरणी में कुंजियों को जोड़ना जो मैं लौटता हूं, लेकिन क्या ऐसा करने के लिए एक मानक क्लीनर तरीका है?

मैं यह महसूस करता हूं कि यह एक ऐसा सरल फंक्शन होना चाहिए जो मुझे याद रहे, लेकिन मैं इसे ढूंढ नहीं पाया!


मैं सिर्फ जावास्क्रिप्ट में कूद रहा हूं, लेकिन यह पोस्ट आपकी मदद कर सकती है। dean.edwards.name/weblog/2006/07/enum
jason


1
कुंजियों से मान प्राप्त करने के बारे में क्या? इसके अलावा, हैश में कुंजियों की संख्या प्राप्त करना।
शून्य_कूल

2017 का उत्तर: Object.keys (h) Object.values ​​(h)
खो

जवाबों:


274

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

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

संगतता विवरण यहां देखे जा सकते हैं

मोज़िला साइट पर पिछड़े संगतता के लिए एक स्निपेट भी है:

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;
}

यह अधिक स्वाभाविक नहीं था? if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
एककिस

2
मैं समझता हूँ के रूप में यह Object.prototype.keysकर देगा keysइसलिए सभी वस्तुओं के लिए वस्तु के सभी उप-वर्गों के लिए उपलब्ध,। जो शायद आप OOP का उपयोग करने की कोशिश कर रहे हैं। वैसे भी यह वास्तव में आपकी आवश्यकताओं पर निर्भर करता है।
इवान नेवोस्त्रुव

1
यदि आप म्यूटूल का उपयोग करते हैं, तो Object.keys () सभी ब्राउज़रों में उपलब्ध होना चाहिए।
thepeer

क्या कोणीय टेम्पलेट्स में इसका उपयोग करने के लिए कुछ है? इसके अंदर काम नहीं कर रहा है।
जय शुक्ला

मुझे लगता है कि आपको इसे कोड नमूने के साथ अलग प्रश्न के रूप में पूछना चाहिए।
इवान नेवोस्त्रुव

80

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

ECMAScript 5 के अनुसार - Object.defineProperty

ECMA5 के रूप में आप Object.defineProperty()गैर-गुणांक गुणों को परिभाषित करने के लिए उपयोग कर सकते हैं । वर्तमान संगतता अभी भी बहुत कुछ वांछित हो गया है, लेकिन यह अंत में सभी ब्राउज़रों में प्रयोग करने योग्य होना चाहिए। (विशेष रूप से 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' इस ऑब्जेक्ट के प्रोटोटाइप पर गुणों को बाहर करता है, जो जानना उपयोगी है।
11

2
उत्तर स्वीकार कर लिया गया है, क्योंकि मैंने इसे लागू करना समाप्त कर दिया है, लेकिन मुझे लगता है कि यह भाषा का एक अंतर्निहित कार्य होना चाहिए था।
पैट

5
ध्यान दें कि वैश्विक चर बनाने से बचने के लिए आपको "(इस में var i) ..." का उपयोग करना चाहिए।
ब्रैड जी

5
मैं Object.prototyp को संशोधित करने से बचना चाहता हूं - जैसा कि एक अन्य टिप्पणीकार ने नीचे उल्लेख किया है, यह आसानी से स्क्रिप्ट को तोड़ सकता है जो hasOwnProperty () की जाँच के बारे में सावधान नहीं हैं। इसके बजाय, कम OO- फ्रेंडली तरीके का उपयोग करें: 'चाबियाँ' फ़ंक्शन को परिभाषित करें यदि यह पहले से मौजूद नहीं है। (फ़ायरफ़ॉक्स और क्रोम दोनों एक देशी कुंजी लागू करते हैं () फ़ंक्शन जो ठीक वही करता है जो ओपी चाहता है - IE नहीं करता है)
digitalbath

1
Object.prototype में कुछ भी जोड़ना एक बुरा विचार है, क्योंकि यह हर सामान्य लूप को तोड़ता है: जैसे (सरणी में k) {} या (वस्तु में var k), और वह मुहावरा - हालाँकि यह दोषपूर्ण हो सकता है - बेहद आम है। उदाहरण के लिए, मैथ्यू डार्विन के जवाब के अनुसार, यह Google मैप्स को तोड़ता है।
सैम वाटकिंस

42

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

Object.keys(h)

3
ECMAScript 5 में जोड़ा गया लेकिन अब तक के सबसे प्रमुख ब्राउज़रों में काम करना चाहिए
पैट

33

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

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

खैर, यह वास्तव में नहीं पूछा गया था, क्योंकि @Pat एक अंतर्निहित फ़ंक्शन की तलाश में है, लेकिन यह एक दिलचस्प पुस्तकालय है, लेकिन यह संशोधित नहीं होता हैObject.prototype
fresskoma

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

_.keys(obj).lengthयह देखने के लिए कि क्या कोई चाबी है।
चॉवि सिप

13

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

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

2
यह तब भी काम नहीं करता है जब Object.prototype के साथ गड़बड़ की गई है।
फिल

4
इसका उपयोग करना बेहतर होगा, और ऑब्जेक्ट "प्रोटोटाइप "के साथ गड़बड़ न करें। ऐसा लगता है कि सब कुछ टूट जाता है अगर हम Object.prototyp में चीजें जोड़ते हैं: यह एक सरणी / वस्तु की कुंजी पर लूप करने के लिए एक अत्यंत सामान्य मुहावरा है।
सैम वाटकिंस

8

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; });
pimlottc

6

मेरा मानना ​​है कि आप वस्तु के गुणों के माध्यम से / के लिए उपयोग कर लूप कर सकते हैं, इसलिए आप ऐसा कुछ कर सकते हैं:

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

4

मैं ऊपर दिए गए टॉप रेटेड उत्तर का उपयोग करना चाहता था

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

हालाँकि जब Google मैप्स API v3 के संयोजन में उपयोग किया जाता है, तो Google मैप्स गैर-कार्यात्मक होते हैं।

for (var key in h) ...

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


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हैशमैप ऑब्जेक्ट है जिसमें कुंजियाँ हैं

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