जावास्क्रिप्ट ऑब्जेक्ट कुंजी सूची प्राप्त करना


295

मेरे पास एक जावास्क्रिप्ट ऑब्जेक्ट है जैसे

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

मैं इस ऑब्जेक्ट में कुंजियों की लंबाई और सूची कैसे प्राप्त कर सकता हूं?



@ टीजे मुझे लगता है कि यह पूरी तरह समान नहीं है। यह एक ऑब्जेक्ट है, डुप्लिकेट एक JSON ऑब्जेक्ट है।
गाइटी

यदि आपके पास अंडरस्कोर है, तो बस _.keys (your_object)
मिन्हाजुल

1
जैसा कि 2010 से चीजें बदल गई हैं, सबसे उत्तोलित उत्तर को "उत्तर" के रूप में स्वीकार करना बेहतर हो सकता है
जोनास विल्म्स

जवाबों:


341

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
};
var keys = [];

for (var k in obj) keys.push(k);

alert("total " + keys.length + " keys: " + keys);


मुझे नहीं लगता कि जावास्क्रिप्ट PHP की तरह है, जहां आप पहली पंक्ति को पूरी तरह से छोड़ सकते हैं? ऐसा नहीं है कि ऐसा कुछ भी करने की सलाह दी जाती है।
बार्ट वैन ह्युकेलम

@ बार्ट: नहीं, जावास्क्रिप्ट में पहली पंक्ति आवश्यक है।
डैनियल वेसलो

6
यहां एक किनारे मामले के लिए आपको डेविड मॉरिससे की टिप्पणी पर एक नज़र डालनी चाहिए। कभी-कभी इस दृष्टिकोण को लेने से प्रोटोटाइप के अवांछित सदस्य दिखाई देंगे keys

2
@ पानी: यदि आप वस्तु शाब्दिक का उपयोग कर रहे हैं, तो यह केवल तभी होगा जब आप विस्तार करेंगे Object.prototype, जो आपको वैसे भी नहीं करना चाहिए। कस्टम बिल्डरों के लिए, हालांकि, आप सही हैं।
साशा चोडगोव

@BartvanHeukelom ने जून 2010 में भी एक नोटिस का कारण बना, क्योंकि इसका मतलब है कि आप ऑब्जेक्ट टाइप कर रहे हैं। []इसे (या array()फिर वापस) असाइन करना इसे एक सरणी बनाता है, जिसे आप तब एक सरणी के रूप में सुरक्षित रूप से उपयोग कर सकते हैं।
नील्स केयूरेंटजेस

627

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+  keys);

यह अब सबसे प्रमुख ब्राउज़रों पर समर्थित है


7
तथ्य यह है कि यह क्रोम में काम करता है इसका मतलब यह भी है कि यह Node.js में काम करता है क्योंकि दोनों V8 जावास्क्रिप्ट इंजन पर बनाए गए हैं।
होमी ज़वागस्त्र

9
@fet आजकल, हाँ। दो साल पहले, इतना नहीं।
AlbertEngelB

4
ध्यान दें कि यह अलग है for(key in ob)! Object.keysअभ्यस्त प्रोटोटाइप से कुंजी सूची, लेकिन .. in objकरता है।
अल्बर्ट

9
@fet windows7 IE8 के साथ आया था। जब तक महान होगा, तब तक कोई रास्ता नहीं है जब तक कि लोग IE8 का उपयोग करना बंद न कर दें, यह स्वीकृत उत्तर नहीं हो सकता है।
snuggles

1
यहाँ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… आपको एक जावास्क्रिप्ट विधि मिली है जो पुराने ब्राउज़रों में सही ढंग से काम करती है और नए ब्राउज़रों में कार्यक्षमता को अधिलेखित नहीं करती है। मेरा जवाब भी नीचे देखिए।
सैंड्रो

27

Underscore.js परिवर्तन को बहुत साफ बनाता है:

var keys = _.map(x, function(v, k) { return k; });

संपादित करें: मैंने याद किया कि आप यह भी कर सकते हैं:

var keys = _.keys(x);

यह सही है, वास्तविक अंडरस्कोर स्रोत: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function (obj, key) {return hasOwnProperty.call (obj, key); }; _.keys = nativeKeys || function (obj) {if (obj! == object (obj)) नए टाइपError ('अमान्य ऑब्जेक्ट') को फेंकें; var कुंजी = []; for (var key in obj) यदि ( .has (obj, कुंजी)) keys.push (कुंजी); वापसी कुंजी; };
मिगुएल एलेजांद्रो फुएंटेस लोपेज

18

यदि आप केवल उन कुंजियों को चाहते हैं जो उस विशेष वस्तु के लिए विशिष्ट हैं और कोई व्युत्पन्न prototypeगुण नहीं:

function getKeys(obj) {
    var r = []
    for (var k in obj) {
        if (!obj.hasOwnProperty(k)) 
            continue
        r.push(k)
    }
    return r
}

उदाहरण के लिए:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays

4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

ऑब्जेक्ट से किसी भी मूल्य तक पहुंचने के लिए, आप obj [कुंजी] का उपयोग कर सकते हैं;


आपको सरणी इंडेक्स बढ़ाने की आवश्यकता है
विवेक

सरणी सूचकांक स्वचालित रूप से बढ़ जाता है keys.length, जो प्रत्येक पुनरावृत्ति के लिए अलग होता है क्योंकि प्रत्येक पुनरावृत्ति एक मान सम्मिलित करता है।
ट्रेकडी जूल

4
obj = {'a':'c','b':'d'}

तुम कोशिश कर सकते हो:

[index for (index in obj)] 

यह वापस आ जाएगा:

['a','b']

कुंजी की सूची पाने के लिए या

[obj[index] for (index in obj)]

मान प्राप्त करने के लिए


Google Chrome v16.0.912.75 में काम नहीं करता है, लेकिन यह फ़ायरफ़ॉक्स v10.0 में काम करता है
RobM

4

अनुराग का उत्तर मूल रूप से सही है। लेकिन Object.keys(obj)पुराने ब्राउज़रों में समर्थन के लिए आप नीचे दिए गए कोड का उपयोग कर सकते हैं जो कि https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys से कॉपी किया गया है । Object.keys(obj)यदि यह ब्राउज़र से उपलब्ध नहीं है तो यह विधि जोड़ता है।

if (!Object.keys) {
 Object.keys = (function() {
 'use strict';
 var hasOwnProperty = Object.prototype.hasOwnProperty,
    hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
    dontEnums = [
      'toString',
      'toLocaleString',
      'valueOf',
      'hasOwnProperty',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'constructor'
    ],
    dontEnumsLength = dontEnums.length;

return function(obj) {
  if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
    throw new TypeError('Object.keys called on non-object');
  }

  var result = [], prop, i;

  for (prop in obj) {
    if (hasOwnProperty.call(obj, prop)) {
      result.push(prop);
    }
  }

  if (hasDontEnumBug) {
    for (i = 0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) {
        result.push(dontEnums[i]);
      }
    }
  }
  return result;
};
}());
}

3

ध्यान दें कि कॉफ़ीस्क्रिप्ट में यह सभी ब्राउज़रों और नोड के रूप में पूरा किया जा सकता है

k for k of obj

और इस तरह

(1 for _ of obj).length

3

ECMAScript 5 का समर्थन करने वाले ब्राउज़रों के लिए पुनरावर्ती समाधान:

var getObjectKeys = function(obj) {
    var keys = Object.keys(obj);
    var length = keys.length;

    if (length !== 0) {
        for (var i = 0; i < length; i++) {
            if (typeof obj[keys[i]] === 'object') {
                keys[keys[i]] = getObjectKeys(obj[keys[i]]);
            }
        }
    }

    return keys;
};

3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)


3

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

var obj = {
    key1: 'value1',
    key2: 'value2',
    key3: 'value3',
    key4: 'value4'
}

var keys = [];
_.each( obj, function( val, key ) {
    keys.push(key);
});
console.log(keys.lenth, keys);

3

जावास्क्रिप्ट में, एक ऑब्जेक्ट एक स्टैंडअलोन इकाई है, जिसमें गुण और प्रकार हैं।

सरणी के रूप में वस्तु से मूल्यों को प्राप्त करने में कठिनाई के लिए: वस्तु .values (obj) // obj ऑब्जेक्ट नाम है कि आप प्रयोग किया जाता है परिणाम -> [ "मान 1", "मान 2", "value3", "VALUE4"]

सरणी के रूप में वस्तु से चाबी प्राप्त करने में कठिनाई के लिए: वस्तु .keys (obj) // obj ऑब्जेक्ट नाम है कि आप प्रयोग किया जाता है परिणाम -> [ "कुंजी 1", "कुंजी 2", "key3", "key4"]

जैसा कि दोनों फ़ंक्शन सरणी लौटा रहे हैं आप लंबाई की संपत्ति का उपयोग करके कुंजी या मूल्य की लंबाई प्राप्त कर सकते हैं। उदाहरण के लिए - ऑब्जेक्ट .values ​​(obj) .length या ऑब्जेक्ट .keys (obj) .length


2

JSON ऑब्जेक्ट की कुंजियों को सूचीबद्ध करने के लिए अल्पविराम-आधारित स्ट्रिंग के लिए, निम्नलिखित प्रयास करें:

function listKeys(jObj){
    var keyString = '';
    for(var k in jObj){
        keyString+=(','+k);
    }
    return keyString.slice(1);
}



/* listKeys({'a' : 'foo', 'b' : 'foo', 'c' : 'foo'}) -> 'a,b,c' */

2

ES6 का उपयोग करके, आप forEachकिसी ऑब्जेक्ट की कुंजी पर पुनरावृति करने के लिए उपयोग कर सकते हैं । उन सभी कुंजियों को प्राप्त करने के लिए, Object.keysजिनका उपयोग आप कर सकते हैं, जो एक वस्तु में सभी कुंजियों को लौटाता है

Object.keys(obj).forEach(function(keyValue, index, map) { 
  console.log(keyValue); 
});

उपरोक्त स्निपेट का छोटा हाथ होगा, जो केवल एक पैरामीटर लेता है

Object.keys(obj).forEach(function(keyValue) { 
  console.log(keyValue); 
});


0

स्लाइस का उपयोग करना, आवेदन करना और विधि में शामिल होना।

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.