मैं जावास्क्रिप्ट ऑब्जेक्ट के माध्यम से कैसे लूप या गणना कर सकता हूं?


2877

मेरे पास निम्नलिखित की तरह एक जावास्क्रिप्ट ऑब्जेक्ट है:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

अब मैं सभी के माध्यम से लूप करना चाहते हैं pतत्वों ( p1, p2, p3...) और उनके कुंजी और मूल्यों मिलता है। मैं उसे कैसे कर सकता हूँ?

यदि आवश्यक हो तो मैं जावास्क्रिप्ट ऑब्जेक्ट को संशोधित कर सकता हूं। मेरा अंतिम लक्ष्य कुछ प्रमुख मूल्य जोड़े के माध्यम से लूप करना है और यदि संभव हो तो मैं उपयोग करने से बचना चाहता हूं eval


9
ऑब्जेक्ट ऑब्जेक्ट्स और JSON के भ्रमित होने से बचने के लिए मैंने JSON को जावास्क्रिप्ट (ऑब्जेक्ट) में बदल दिया।
फेलिक्स क्लिंग

जवाबों:


4364

आप for-inलूप का उपयोग दूसरों द्वारा दिखाए गए अनुसार कर सकते हैं। हालाँकि, आपको यह भी सुनिश्चित करना होगा कि आपको मिलने वाली कुंजी किसी वस्तु की वास्तविक संपत्ति है, और प्रोटोटाइप से नहीं आती है।

यहाँ स्निपेट है:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (var key in p) {
    if (p.hasOwnProperty(key)) {
        console.log(key + " -> " + p[key]);
    }
}

Object.keys () विकल्प के साथ:

var p = {
    0: "value1",
    "b": "value2",
    key: "value3"
};

for (var key of Object.keys(p)) {
    console.log(key + " -> " + p[key])
}

for-ofइसके बजाय के उपयोग पर ध्यान दें for-in, यदि इसका उपयोग नहीं किया जाता है तो यह नामित गुणों पर अपरिभाषित हो जाएगा, और Object.keys()पूरे प्रोटोटाइप-श्रृंखला गुणों के बिना केवल ऑब्जेक्ट के अपने गुणों का उपयोग सुनिश्चित करता है

नई Object.entries()विधि का उपयोग :

नोट: यह विधि इंटरनेट एक्सप्लोरर द्वारा मूल रूप से समर्थित नहीं है। आप पुराने ब्राउज़रों के लिए पॉलीफ़िल का उपयोग करने पर विचार कर सकते हैं।

const p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (let [key, value] of Object.entries(p)) {
  console.log(`${key}: ${value}`);
}

34
प्रस्तावित करेंगे कि आप चेतावनी लाइन को स्पष्टता के लिए केवल बदल देंगेalert(key + " -> " + JSON.stringify(p[key]));
स्टीव मिडगले

80
क्या आप hasOwnProperty की आवश्यकता बता सकते हैं? प्रोटोटाइप से आपका क्या मतलब है?
कामसी

331
जावास्क्रिप्ट में, प्रत्येक ऑब्जेक्ट में अंतर्निहित कुंजी-मूल्य जोड़े का एक गुच्छा होता है जिसमें मेटा-जानकारी होती है। जब आप एक वस्तु के लिए सभी कुंजी-मूल्य जोड़े के माध्यम से लूप करते हैं तो आप उनके माध्यम से भी लूप कर रहे हैं। hasOwnPropery () इन्हें फ़िल्टर करता है।
danieltalsky

57
वास्तव में, के लिए ... पदावनत नहीं है। प्रत्येक के लिए ... में है। लेकिन मुझे वास्तव में पुरातत्वविदों के शब्द पसंद हैं ... मुझे इसका उपयोग शुरू करना होगा।
बेन वाई

17
जावास्क्रिप्ट में प्रत्येक वस्तु (वास्तव में एक कुंजी-मूल्य जोड़ी) में एक संपत्ति होती है जिसे __proto__या कहा जाता है prototype। इस संपत्ति में इसकी मूल वस्तु का संदर्भ है। एक वस्तु स्वतः ही अपने माता-पिता से संपत्ति प्राप्त करती है। यह उपयोग करने का कारण है hasOwnProperty, जो दर्शाता है कि हम वस्तुओं में रुचि रखते हैं, न कि अपने माता-पिता के लिए।
जुबैर आलम

1103

ECMAScript 5 के अंतर्गत, आप को जोड़ सकते हैं Object.keys()और Array.prototype.forEach():

var obj = { first: "John", last: "Doe" };

Object.keys(obj).forEach(function(key) {
    console.log(key, obj[key]);
});

ECMAScript 6 में जोड़ा गया है for...of:

for (const key of Object.keys(obj)) {
    console.log(key, obj[key]);
}

ECMAScript 8 में वह जोड़ा गया है Object.entries()जो मूल वस्तु में प्रत्येक मूल्य को देखने से बचता है:

Object.entries(obj).forEach(
    ([key, value]) => console.log(key, value)
);

आप गठबंधन कर सकते हैं for...of, विनाश कर सकते हैं , और Object.entries:

for (const [key, value] of Object.entries(obj)) {
    console.log(key, value);
}

एक लूप के रूप में एक ही क्रम में दोनों Object.keys()और Object.entries()पुनरावृति गुण लेकिन प्रोटोटाइप श्रृंखला को अनदेखा करते हैं । केवल वस्तु के स्वयं के असंख्य गुण पुनरावृत्त होते हैं।for...in


21
मानक क्यों नहीं दिया Object.forEach(obj, function (value, key) {...})? :( निश्चित रूप obj.forEach(function...)से कम होगा और पूरक होगा Array.prototype.forEach, लेकिन यह कि वस्तुओं को अपनी forEachसंपत्ति को परिभाषित करने का जोखिम होगा । मुझे लगता है Object.keysकि ऑब्जेक्ट की कुंजी को संशोधित करने वाले कॉलबैक के खिलाफ गार्ड।
डेविड हरकेंस

7
Object.forEach = function (obj, callback) { Object.keys(obj).forEach(function (key) { callback(obj[key], key); }); }
डेविड हरकेंस

7
@DavidHarkness ES2017 में Object.entries है। वहां आप निम्नलिखित कार्य कर सकते हैं: Object.entries(obj).map/forEach(([key, value]) => console.log(key, value))([कुंजी, मूल्य] सरणी विनाशकारी है, दोनों वस्तुओं को सीधे एक्सेस करने के लिए। और आपको अतिरिक्त
पैरेन्स

मुझे indexjson में कुंजी कैसे मिलती है? या यदि आवश्यक हो तो मुझे एक अलग काउंटर का उपयोग करना चाहिए?
सर्वनाबलागी रामचंद्रन

3
for...ofES6 मानक है, ES2016 नहीं है।
रक्स वेबर

342

आपको फॉर-लूप का उपयोग करना होगा

लेकिन इस तरह के लूप का उपयोग करते समय बहुत सावधान रहें, क्योंकि यह प्रोटोटाइप श्रृंखला के साथ सभी गुणों को लूप करेगा ।

इसलिए, जब फॉर-इन लूप का उपयोग किया जाता है, तो हमेशा यह hasOwnPropertyनिर्धारित करने के लिए विधि का उपयोग करें कि क्या पुनरावृत्ति में वर्तमान संपत्ति वास्तव में आपके द्वारा जांच की जा रही वस्तु की संपत्ति है:

for (var prop in p) {
    if (!p.hasOwnProperty(prop)) {
        //The current property is not a direct property of p
        continue;
    }
    //Do your logic with the property here
}

31
यह लेविक के समाधान से बेहतर है क्योंकि यह मुख्य तर्क को दो के बजाय केवल एक नेस्टेड लूप होने की अनुमति देता है; कोड पढ़ने के लिए आसान बनाने के लिए। हालाँकि मैं कोष्ठक को जारी रखूँगा; वे शानदार हैं।
SystemicPlural

52
मैं { }व्यक्तिगत रूप से नहीं हटाऊंगा क्योंकि ifउनके बिना यह थोड़ा अस्पष्ट है कि क्या हिस्सा है ifऔर क्या नहीं है। लेकिन मुझे लगता है कि यह केवल एक राय है :)
pimvdb

34
हां, मैं { }मुख्य रूप से भ्रम से बचने के लिए रखना पसंद करता हूं अगर एक को बाद में ifगुंजाइश में कुछ जोड़ने की आवश्यकता होती है।
एंड्रियास ग्रेच

8
मेरी पिछली टिप्पणी को पढ़ते हुए, मुझे एहसास हुआ कि मैंने सही शब्दों का उपयोग नहीं किया है, क्योंकि मैंने कहा "अगर गुंजाइश है"; लेकिन ध्यान रखें कि जावास्क्रिप्ट में केवल फंक्शन स्कोप है। तो मेरा वास्तव में मतलब था "अगर ब्लॉक"।
एंड्रियास ग्रीच

1
eomeroff, यदि आप वास्तव में इस बारे में चिंतित हैं, तो आप हमेशा कुछ ऐसा कर सकते हैं: Object.prototype.hasOwnProperty.call(p, prop) हालाँकि, यह भी ऑब्जेक्ट के लिए जोड़तोड़ से रक्षा नहीं कर सकता है।
jordancpaul

252

यदि हम वस्तुओं के माध्यम से लूपिंग के लिए वैकल्पिक तरीकों का उल्लेख नहीं करते हैं तो यह प्रश्न पूरा नहीं होगा।

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

  1. यदि आप jQuery के साथ काम करते हैं , तो आप jQuery.each()विधि का उपयोग कर सकते हैं । इसका उपयोग वस्तुओं और सरणियों दोनों पर मूल रूप से पुनरावृति करने के लिए किया जा सकता है:

    $.each(obj, function(key, value) {
        console.log(key, value);
    });
  2. अंडरस्कोर में। js आप विधि पा सकते हैं _.each(), जो तत्वों की सूची से अधिक iterates, एक आपूर्ति कार्य करने के लिए बदले में प्रत्येक उपज (में बहस के क्रम में भुगतान ध्यान iteratee समारोह!):

    _.each(obj, function(value, key) {
        console.log(key, value);
    });
  3. लो-डैश ऑब्जेक्ट की संपत्तियों पर पुनरावृत्ति के लिए कई तरीके प्रदान करता है। बेसिक _.forEach()(या यह उर्फ _.each()) दोनों वस्तुओं और सरणियों के माध्यम से लूपिंग के लिए उपयोगी है, हालांकि (!) lengthसंपत्ति के साथ वस्तुओं को सरणियों की तरह व्यवहार किया जाता है, और इस व्यवहार से बचने के लिए इसका उपयोग करने का सुझाव दिया जाता है।_.forIn()_.forOwn() तरीके और तरीके (इनमें भी valueतर्क पहले आ रहे हैं):

    _.forIn(obj, function(value, key) {
        console.log(key, value);
    });

    _.forIn() पर निर्भर करता है खुद और विरासत में मिला एक वस्तु का गणनीय गुण है, जबकि _.forOwn()दोहराता केवल अधिक स्वयं के एक वस्तु के गुणों (मूल रूप से के खिलाफ जाँच hasOwnPropertyसमारोह)। सरल वस्तुओं और वस्तु शाब्दिक के लिए इनमें से कोई भी तरीका ठीक काम करेगा।

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


4
मान प्राप्त करने के लिए: $ .each (obj, function (key, value) {कंसोल.लॉग (value.title);}));
रवि राम

2
बस अजीब बात है कि कैसे अंडरस्कोर और jquery ने मापदंडों को बदल दिया :)
ppasler

52

ECMAScript 5 में आपके पास शाब्दिक के पुनरावृति क्षेत्रों में नया दृष्टिकोण है - Object.keys

अधिक जानकारी आप एमडीएन पर देख सकते हैं

मेरी पसंद ब्राउज़रों के वर्तमान संस्करणों में अधिक तेज़ समाधान के रूप में नीचे है (Chrome30, IE10, FF25)

var keys = Object.keys(p),
    len = keys.length,
    i = 0,
    prop,
    value;
while (i < len) {
    prop = keys[i];
    value = p[prop];
    i += 1;
}

आप jsperf.com पर विभिन्न कार्यान्वयन के साथ इस दृष्टिकोण के प्रदर्शन की तुलना कर सकते हैं :

ब्राउज़र समर्थन जिसे आप देख सकते हैं Kangax की कॉम्पिटिटर टेबल

पुराने ब्राउज़र के लिए आपके पास सरल और पूर्ण पॉलीफ़िल है

युपीडी:

इस सवाल पर सभी सबसे लोकप्रिय मामलों के लिए प्रदर्शन की तुलना perfjs.info :

वस्तु शाब्दिक पुनरावृत्ति


दरअसल, मैं सिर्फ इस तरीके को पोस्ट करना चाहता था। लेकिन आपने मुझे इसके लिए हराया :(
जेमी हटर

50

प्रस्तावना:

  • ऑब्जेक्ट गुण स्वयं हो सकते हैं (संपत्ति ऑब्जेक्ट पर ही है) या विरासत में मिली है (ऑब्जेक्ट पर ही नहीं, इसके किसी प्रोटोटाइप पर)।
  • ऑब्जेक्ट गुण enumerable या गैर- enumerable हो सकते हैं । नॉन-एनेमरेबल प्रॉपर्टीज में बहुत सारी प्रॉपर्टी एनुमरेशंस / एरेज़ से बची हैं
  • संपत्ति के नाम तार या प्रतीक हो सकते हैं। ऐसे गुण जिनके नाम सिंबल हैं, बहुत सारी संपत्ति एन्यूमरेशन / एरेज़ से बचे हुए हैं।

2018 में, ऑब्जेक्ट के गुणों के माध्यम से लूप करने के आपके विकल्प हैं (कुछ उदाहरण सूची का अनुसरण करते हैं):

  1. for-in[ एमडीएन , स्पेक ] - एक लूप संरचना जो किसी वस्तु के असंख्य गुणों के नामों से गुज़रती है, जिसमें विरासत में मिली चीजें शामिल हैं, जिनके नाम तार हैं
  2. Object.keys[ MDN , कल्पना ] - एक समारोह एक वस्तु के के नाम की एक सरणी प्रदान खुद , गणनीय गुण जिनके नाम तार कर रहे हैं।
  3. Object.values[ एमडीएन , स्पेक ] - एक फ़ंक्शन किसी ऑब्जेक्ट के स्वयं के , अनगिनत गुणों के मूल्यों की एक सरणी प्रदान करता है ।
  4. Object.entries[ एमडीएन , स्पेक ] - एक फ़ंक्शन नाम और ऑब्जेक्ट की स्वयं की , नामांकित गुणों (सरणी में प्रत्येक प्रविष्टि एक [name, value]सरणी है) के नाम और मूल्यों की एक सरणी प्रदान करता है ।
  5. Object.getOwnPropertyNames[ एमडीएन , स्पेक ] - किसी वस्तु के स्वयं के गुणों के नाम की एक सरणी प्रदान करने वाला एक फ़ंक्शन (यहां तक ​​कि गैर-एन्यूमरेबल) जिनके नाम तार हैं।
  6. Object.getOwnPropertySymbols[ एमडीएन , कल्पना ] - किसी वस्तु के स्वयं के गुणों के नाम की एक सरणी प्रदान करने वाला एक फ़ंक्शन (यहां तक ​​कि गैर-एनुलेबल वाले) जिनके नाम सिंबल हैं।
  7. Reflect.ownKeys[ एमडीएन , स्पेक ] - एक फ़ंक्शन किसी ऑब्जेक्ट के स्वयं के गुणों के नाम की एक सरणी प्रदान करता है (यहां तक ​​कि गैर-एन्यूमरेबल भी), चाहे वे नाम स्ट्रिंग हों या सिंबल।
  8. यदि आप चाहते हैं सभी गैर गणनीय विरासत में मिला भी शामिल होते हैं एक वस्तु के गुण, के लिए, आप एक पाश और उपयोग करने की आवश्यकता Object.getPrototypeOf[ MDN , कल्पना ] और उपयोग Object.getOwnPropertyNames, Object.getOwnPropertySymbolsया Reflect.ownKeys(इस जवाब के तल पर उदाहरण) प्रोटोटाइप श्रृंखला में प्रत्येक वस्तु पर।

साथ उन सभी को सिवाय for-in, आप सरणी पर निर्माण पाशन (किसी तरह का प्रयोग करेंगे for, for-of, forEach, आदि)।

उदाहरण:

for-in:

Object.keys (एक for-ofलूप के साथ , लेकिन आप किसी भी लूपिंग निर्माण का उपयोग कर सकते हैं) :

Object.values:

Object.entries:

Object.getOwnPropertyNames:

Object.getOwnPropertySymbols:

Reflect.ownKeys:

सभी गुण , जिनमें गैर-गणनीय शामिल हैं:


Enumerable / गैर-प्रवर्तनीय वस्तु गुणों का अच्छा जोड़।
सेराओज़ेस

49

आप इसे इस पर पूरा कर सकते हैं:

for (var key in p) {
  alert(p[key]);
}

ध्यान दें कि keyसंपत्ति के मूल्य पर नहीं लगेगा, यह सिर्फ एक सूचकांक मूल्य है।


13
यह दोहराया जाता है और पूरी तरह से सही भी नहीं है। इस काम को ठीक से करने के लिए आपके पास hasOwnProperty का चेक होना आवश्यक है
Vatsal

4
मैंने शुरू में इसे उपरोक्त टिप्पणी के आधार पर घटाया जब तक मुझे एहसास नहीं हुआ कि यह उत्तर पहले आया था, इसलिए "दोहराया नहीं गया"। यह संभवतः अपूर्ण है लेकिन कई मामलों के लिए ठीक काम करता है।
billynoah

27

चूंकि es2015 अधिक से अधिक लोकप्रिय हो रहा है, मैं इस उत्तर को पोस्ट कर रहा हूं जिसमें [key, value]जोड़े के माध्यम से सुचारू रूप से पुनरावृति करने के लिए जनरेटर और इटेटर का उपयोग शामिल है । जैसा कि रूबी के लिए अन्य भाषाओं में संभव है।

ठीक है यहाँ एक कोड है:

const MyObject = {
  'a': 'Hello',
  'b': 'it\'s',
  'c': 'me',
  'd': 'you',
  'e': 'looking',
  'f': 'for',
  [Symbol.iterator]: function* () {
    for (const i of Object.keys(this)) {
      yield [i, this[i]];
    }
  }
};

for (const [k, v] of MyObject) {
  console.log(`Here is key ${k} and here is value ${v}`);
}

डेवलपर मोज़िला पृष्ठ पर आप एक इट्रेटर और जनरेटर कैसे कर सकते हैं, इसके बारे में सभी जानकारी।

आशा है कि यह किसी की मदद की।

संपादित करें:

ES2017 में वे शामिल होंगे Object.entriesजो [key, value]वस्तुओं में जोड़े के ऊपर पुनरावृति को और भी आसान बना देंगे । अब यह ज्ञात है कि यह ts39 के अनुसार एक मानक का एक हिस्सा होगा चरण की जानकारी के ।

मुझे लगता है कि मेरे जवाब को अपडेट करने का समय आ गया है, क्योंकि यह अब की तुलना में अधिक ताजा हो गया है।

const MyObject = {
  'a': 'Hello',
  'b': 'it\'s',
  'c': 'me',
  'd': 'you',
  'e': 'looking',
  'f': 'for',
};

for (const [k, v] of Object.entries(MyObject)) {
  console.log(`Here is key ${k} and here is value ${v}`);
}

आप MDN पृष्ठ पर उपयोग के बारे में और जानकारी प्राप्त कर सकते हैं


यह मेरे लिए पूरी तरह से अतिशयोक्तिपूर्ण / अनावश्यक है। क्या आप इसे अपने सिस्टम में हर वस्तु से जोड़ेंगे? मुझे लगा कि एक पुनरावृत्ति प्रदान करने का बिंदु इतना है कि आप `(myObject के कास्ट [k, v]) के लिए कर सकते हैं। यह सिर्फ अतिरिक्त कोड प्रदान करता है जो थोड़ा अतिरिक्त मूल्य प्रदान करता है।
डीन रेडक्लिफ

22
for(key in p) {
  alert( p[key] );
}

नोट: आप इसे सरणियों पर कर सकते हैं, लेकिन आप lengthअन्य गुणों पर भी पुनरावृति करेंगे ।


4
इस तरह के लिए एक लूप का उपयोग करते समय, keyबस एक सूचकांक मूल्य पर ले जाएगा, ताकि बस 0, 1, 2, आदि को सतर्क करेगा ... आपको पी [कुंजी] तक पहुंचने की आवश्यकता है।
ब्रायन

1
यह जावास्क्रिप्ट में सरणी पुनरावृत्ति की सबसे धीमी विधि है। आप इसे अपने कंप्यूटर पर देख सकते हैं - जावास्क्रिप्ट में
एरेट्स

5
@Pencroff: समस्या यह है कि सवाल सरणियों के माध्यम से लूपिंग के बारे में नहीं है ...;)
Sk8erPeter

यह एक ऐसी चीज है जिसे मैं स्टैकओवरफ्लो पर नहीं समझता। रिचर्ड ने सही उत्तर दिया, और वह पहला ऐसा उत्तर था, जिसमें उसे कोई +1 नहीं मिला? @ ब्रायन var p = {"p1":"q","p2":"w"}; for(key in p) { alert( key ); }अलर्ट में "p1" और "P2" को पॉप कर रहा है, तो उस बारे में क्या गलत है ???
सेबेस्टियन

5
मुझे लगता है कि मुख्य अंतर गुणवत्ता है: अन्य उत्तर न केवल बताते हैं कि कैसे, बल्कि कैविएट (उदाहरण के लिए, प्रोटोटाइप) और उन कैविटीज़ से निपटने के तरीके भी बताएं। IMHO, वे अन्य उत्तर खान से बेहतर हैं :)।
रिचर्ड लेवासेयुर

20

यहाँ सभी उत्तरों को देखने के बाद, मेरे स्वयं के उपयोग के लिए hasOwnProperty की आवश्यकता नहीं है क्योंकि मेरी json वस्तु साफ है; किसी भी अतिरिक्त जावास्क्रिप्ट प्रसंस्करण को जोड़ने में वास्तव में कोई मतलब नहीं है। यह सब मैं उपयोग कर रहा हूँ:

for (var key in p) {
    console.log(key + ' => ' + p[key]);
    // key is key
    // value is p[key]
}

18
JSON ऑब्जेक्ट साफ है या नहीं अप्रासंगिक है। यदि किसी अन्य समय में कोई कोड किसी संपत्ति पर सेट करता है Object.prototype, तो वह इसके द्वारा गणना की जाएगी for..in। यदि आप सुनिश्चित हैं कि आप ऐसा करने वाले किसी भी पुस्तकालय का उपयोग नहीं कर रहे हैं, तो आपको कॉल करने की आवश्यकता नहीं है hasOwnProperty
G-Wiz

4
यह पूरी तरह से साफ किया जा सकता है, तो साथ बनायाObject.create(null)
जुआन मेंडेस

20

के माध्यम से प्रोटोटाइप के साथ foreach () जो छोड़ चाहिए प्रोटोटाइप श्रृंखला गुण:

Object.prototype.each = function(f) {
    var obj = this
    Object.keys(obj).forEach( function(key) { 
        f( key , obj[key] ) 
    });
}


//print all keys and values
var obj = {a:1,b:2,c:3}
obj.each(function(key,value) { console.log(key + " " + value) });
// a 1
// b 2
// c 3

2
प्रोटोटाइप के साथ सावधान रहें: obj = { print: 1, each: 2, word: 3 }उत्पादन करता है TypeError: number is not a function। का उपयोग करते हुए forEachसमान मिलान करने के लिए Arrayसमारोह जोखिम कुछ हद तक कम कर सकते हैं।
डेविड हार्कस

18

यह इन उत्तरों में दिलचस्प लोगों दोनों को छुआ दिया है Object.keys()और for...ofलेकिन उन्हें संयुक्त कभी नहीं:

var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
    console.log(key + ':' + map[key]);

आप न सिर्फ कर सकते हैं for...ofएक Objectहै क्योंकि यह एक इटरेटर नहीं है, और for...indexया .forEach()ing Object.keys()बदसूरत / अक्षम है।
मुझे खुशी है कि अधिकांश लोग for...in(जाँच के साथ या बिना .hasOwnProperty()) से परहेज कर रहे हैं क्योंकि यह भी थोड़ा गड़बड़ है, इसलिए मेरे उत्तर के अलावा, मैं यहाँ कहने के लिए हूँ ...


आप साधारण वस्तु संघों को पुनरावृति बना सकते हैं! Mapfor...ofChrome और FF में काम करने वाले फैंसी
DEMO के प्रत्यक्ष उपयोग के साथ ही व्यवहार करना (मुझे ES6 ही लगता है)

var ordinaryObject = {well:'hello', there:'!'};
for (let pair of ordinaryObject)
    //key:value
    console.log(pair[0] + ':' + pair[1]);

//or
for (let [key, value] of ordinaryObject)
    console.log(key + ':' + value);

जब तक आप नीचे मेरे शिम को शामिल करते हैं:

//makes all objects iterable just like Maps!!! YAY
//iterates over Object.keys() (which already ignores prototype chain for us)
Object.prototype[Symbol.iterator] = function() {
    var keys = Object.keys(this)[Symbol.iterator]();
    var obj = this;
    var output;
    return {next:function() {
        if (!(output = keys.next()).done)
            output.value = [output.value, obj[output.value]];
        return output;
    }};
};

एक वास्तविक मैप ऑब्जेक्ट बनाने के लिए बिना अच्छा सिन्सेटिक चीनी नहीं है।

var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
    console.log(pair[0] + ':' + pair[1]);

वास्तव में, इस शिम के साथ, यदि आप अभी भी मैप की अन्य कार्यक्षमता (उन सभी को चमकाए बिना) का लाभ उठाना चाहते थे, लेकिन फिर भी साफ-सुथरी वस्तु संकेतन का उपयोग करना चाहते थे, क्योंकि वस्तुएं अब पुनरावृत्त हैं, तो अब आप इससे केवल एक नक्शा बना सकते हैं!

//shown in demo
var realMap = new Map({well:'hello', there:'!'});

उन लोगों के लिए जो शिम करना पसंद नहीं करते हैं, या prototypeसामान्य रूप से गड़बड़ करते हैं , बेझिझक इसके बजाय खिड़की पर कार्य करना पसंद करते हैं, इसे getObjIterator()तब कुछ कहते हैं ;

//no prototype manipulation
function getObjIterator(obj) {
    //create a dummy object instead of adding functionality to all objects
    var iterator = new Object();

    //give it what the shim does but as its own local property
    iterator[Symbol.iterator] = function() {
        var keys = Object.keys(obj)[Symbol.iterator]();
        var output;

        return {next:function() {
            if (!(output = keys.next()).done)
                output.value = [output.value, obj[output.value]];
            return output;
        }};
    };

    return iterator;
}

अब आप इसे केवल एक साधारण कार्य कह सकते हैं, बाकी कुछ भी प्रभावित नहीं है

var realMap = new Map(getObjIterator({well:'hello', there:'!'}))

या

for (let pair of getObjIterator(ordinaryObject))

वहाँ कोई कारण नहीं है कि क्यों काम नहीं करेगा।

आने वाला कल आपका स्वागत करता है।


1
मामले में बिंदु । जब तक लोग स्क्रॉल करते हैं और इसे उपयोगी पाते हैं, तब तक यह सब मायने रखता है। आमतौर पर यह मैं कुछ करने की कोशिश कर रहा हूं, जो सामान मैं ऑनलाइन देख रहा हूं, उसे पसंद नहीं कर रहा हूं, यह पता लगा रहा हूं, फिर मैं साझा करने के लिए वापस आता हूं। यह अच्छा है डोको, मैं वास्तव में मेरे अपने जवाबों से पहले आया हूं चीजों को समझने से पहले मैं पूरी तरह से भूल गया हूं!
हसब्रोर्न

@HelpMeStackOverflowMyOnlyHope व्यक्तिगत रूप से मुझे उन वस्तुओं के प्रोटोटाइप को संशोधित करना पसंद नहीं है जिन्हें मैंने खुद को परिभाषित नहीं किया था।
Janus Troelsen

@JanusTroelsen क्या आपने भी पूरा जवाब पढ़ा है? For those who don't like to shim, or mess with prototype in general, feel free to make the function on window instead, calling it something like getObjIterator() then;
हाशबोर्न

ध्यान दें कि यह तकनीक सादे वस्तुओं पर काम नहीं करती है, लेकिन फिर भी उपयोगी है।
no --zɐɹƆ

यह सादे वस्तुओं के लिए काम करता है, यह शाब्दिक रूप से पूरे बिंदु (और साथ ही चर नामों की तरह है) ordinaryObject जोर देने के लिए है कि जादू अभी भी उन प्रकारों के लिए काम करता है)। क्या आपने डेमो की जांच की; आपके लिए क्या काम नहीं कर रहा है, @ noɥʇʎԀʎzɐɹƆ? (पीएस आपकी एसई प्रोफ़ाइल छवि बॉस है)
हैशब्रोन

13

Object.keys (obj): ऐरे

सभी एन्यूमरेबल स्वयं (गैर-विरासत वाले) गुणों की सभी स्ट्रिंग-मूल्यवान कुंजियों को पुनः प्राप्त करता है।

तो यह कुंजियों की एक ही सूची देता है जैसा कि आप प्रत्येक ऑब्जेक्ट कुंजी का hasOwnProperty के साथ परीक्षण करके करना चाहते हैं। आपको उस अतिरिक्त परीक्षण ऑपरेशन की आवश्यकता नहीं है और Object.keys( obj ).forEach(function( key ){})यह तेज़ होना चाहिए। आइए इसे साबित करते हैं:

var uniqid = function(){
			var text = "",
					i = 0,
					possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
			for( ; i < 32; i++ ) {
					text += possible.charAt( Math.floor( Math.random() * possible.length ) );
			}
			return text;
		}, 
		CYCLES = 100000,
		obj = {}, 
		p1,
		p2,
		p3,
		key;

// Populate object with random properties
Array.apply( null, Array( CYCLES ) ).forEach(function(){
	obj[ uniqid() ] = new Date()
});

// Approach #1
p1 = performance.now();
Object.keys( obj ).forEach(function( key ){
	var waste = obj[ key ];
});

p2 = performance.now();
console.log( "Object.keys approach took " + (p2 - p1) + " milliseconds.");

// Approach #2
for( key in obj ) {
	if ( obj.hasOwnProperty( key ) ) {
		var waste = obj[ key ];
	}
}

p3 = performance.now();
console.log( "for...in/hasOwnProperty approach took " + (p3 - p2) + " milliseconds.");

मेरे फ़ायरफ़ॉक्स में मेरे निम्नलिखित परिणाम हैं

  • Object.keys दृष्टिकोण 40.21101451665163 मिलीसेकंड लिया।
  • ... के लिए / hasOwnProperty दृष्टिकोण 98.26163508463651 मिलीसेकंड लिया।

पुनश्च। क्रोम पर भी बड़ा अंतर http://codepen.io/dsheiko/pen/JdrqXa

PS2: ES6 (EcmaScript 2015) में आप iterable ऑब्जेक्ट को अच्छे से टाइप कर सकते हैं:

let map = new Map().set('a', 1).set('b', 2);
for (let pair of map) {
    console.log(pair);
}

// OR 
let map = new Map([
    [false, 'no'],
    [true,  'yes'],
]);
map.forEach((value, key) => {
    console.log(key, value);
});


यदि आप {} संकेतन को जाने देने का मन नहीं करते हैं, तो आप अभी भी एसof Map
हसब्रोन

13

यहाँ एक वस्तु के माध्यम से पुनरावृति करने की एक और विधि है।

   var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};


Object.keys(p).forEach(key => { console.log(key, p[key]) })


3
यह बहुत अच्छा है, हालांकि बड़ी वस्तुओं के लिए, forविधि अधिक निष्पादित हो सकती है।
रॉल्फ


12

आप मान प्राप्त करने के लिए नीचे दिए गए ऑब्जेक्ट की तरह Object.keys () और iterate का उपयोग कर सकते हैं:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

Object.keys(p).forEach((key)=> {
 console.log(key +' -> '+ p[key]);
});


आपने मेरा समय बचाया, थैंक्यू
स्वप-आईओएस-एंड्रॉइड

जानकर खुशी हुई :)
ओनेरा

8

केवल निर्भरता के बिना जावास्क्रिप्ट कोड:

var p = {"p1": "value1", "p2": "value2", "p3": "value3"};
keys = Object.keys(p);   // ["p1", "p2", "p3"]

for(i = 0; i < keys.length; i++){
  console.log(keys[i] + "=" + p[keys[i]]);   // p1=value1, p2=value2, p3=value3
}

8

Object.keys()विधि एक दिए गए वस्तु की अपनी गणनीय गुण की एक सरणी देता है। इसके बारे में यहाँ और पढ़ें

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

Object.keys(p).map((key)=> console.log(key + "->" + p[key]))


8

प्रदर्शन

आज 2020.03.06 मैं MacOs हाई सिएरा v10.13.6 पर Chrome v80.0, Safari v13.0.5 और फ़ायरफ़ॉक्स 73.0.1 पर चुने हुए समाधानों का परीक्षण करता हूँ।

निष्कर्ष

  • for-in(ए, बी) पर आधारित समाधान बड़ी और छोटी वस्तुओं के लिए सभी ब्राउज़रों के लिए तेज़ (या सबसे तेज़) हैं
  • आश्चर्यजनक रूप से for-of(एच) समाधान छोटी और बड़ी वस्तुओं के लिए क्रोम पर तेज है
  • स्पष्ट सूचकांक पर आधारित समाधान i (जे, के) छोटी वस्तुओं के लिए सभी ब्राउज़रों पर काफी तेज हैं (फायरफॉक्स के लिए भी बड़े ओजबेट्स के लिए उपवास करते हैं लेकिन अन्य ब्राउज़रों पर मध्यम तेजी से)
  • पुनरावृत्तियों पर आधारित समाधान (D, E) सबसे धीमे हैं और अनुशंसित नहीं हैं
  • समाधान C बड़ी वस्तुओं के लिए धीमा है और छोटी वस्तुओं के लिए मध्यम-धीमा है

यहां छवि विवरण दर्ज करें

विवरण

के लिए प्रदर्शन परीक्षण किए गए

  • छोटी वस्तु - 3 क्षेत्रों के साथ - आप अपनी मशीन पर परीक्षण कर सकते हैं यहाँ
  • 'बड़ी' ऑब्जेक्ट - 1000 फ़ील्ड्स के साथ - आप अपनी मशीन पर परीक्षण कर सकते हैं यहाँ

नीचे स्निपेट उपयोग किए गए समाधान प्रस्तुत करते हैं

और यहां क्रोम पर छोटी वस्तुओं के लिए परिणाम हैं

यहां छवि विवरण दर्ज करें


7

आप सभी वस्तुओं के लिए एक सरल forEach फ़ंक्शन जोड़ सकते हैं , ताकि आप किसी भी ऑब्जेक्ट के माध्यम से स्वचालित रूप से लूप कर सकें:

Object.defineProperty(Object.prototype, 'forEach', {
    value: function (func) {
        for (var key in this) {
            if (!this.hasOwnProperty(key)) {
                // skip loop if the property is from prototype
                continue;
            }
            var value = this[key];
            func(key, value);
        }
    },
    enumerable: false
});

उन लोगों के लिए जो " ... में " के लिए पसंद नहीं करते हैं -मथोड:

Object.defineProperty(Object.prototype, 'forEach', {
    value: function (func) {
        var arr = Object.keys(this);
        for (var i = 0; i < arr.length; i++) {
            var key = arr[i];
            func(key, this[key]);
        }
    },
    enumerable: false
});

अब, आप सरल कॉल कर सकते हैं:

p.forEach (function(key, value){
    console.log ("Key: " + key);
    console.log ("Value: " + value);
});

यदि आप अन्य forEach-Methods के साथ संघर्ष नहीं करना चाहते हैं, तो आप इसे अपने अद्वितीय नाम के साथ नाम दे सकते हैं।


3
निर्मित वस्तुओं (जैसे Object) के प्रोटोटाइप को संशोधित करना आमतौर पर एक विरोधी पैटर्न माना जाता है क्योंकि यह आसानी से अन्य कोड के साथ टकराव का कारण बन सकता है। इसलिए घाव इस तरह से करने की सलाह नहीं देते हैं।
मोरिट्ज़

6

शुद्ध जावास्क्रिप्ट का उपयोग करते समय लूप्स काफी दिलचस्प हो सकते हैं। ऐसा लगता है कि केवल ECMA6 (न्यू 2015 जावास्क्रिप्ट विनिर्देश) को नियंत्रण में रखा गया। दुर्भाग्य से जैसा कि मैं यह लिख रहा हूं, दोनों ब्राउजर और लोकप्रिय एकीकृत विकास वातावरण (आईडीई) अभी भी पूरी तरह से नई घंटियों और सीटी का समर्थन करने के लिए संघर्ष कर रहे हैं।

एक नज़र में यहाँ ECMA6 से पहले जावास्क्रिप्ट ऑब्जेक्ट लूप जैसा दिखता है:

for (var key in object) {
  if (p.hasOwnProperty(key)) {
    var value = object[key];
    console.log(key); // This is the key;
    console.log(value); // This is the value;
  }
}

इसके अलावा, मुझे पता है कि यह इस प्रश्न के दायरे से बाहर है, लेकिन 2011 में, ECMAScript 5.1 ने forEachकेवल Arrays के लिए विधि जोड़ी, जिसने मूल रूप से सरणियों के माध्यम से लूप करने के लिए एक नया बेहतर तरीका बनाया जबकि अभी भी पुरानी क्रिया और भ्रामक forलूप के साथ गैर-अनुपयोगी वस्तुओं को छोड़ दिया । लेकिन अजीब हिस्सा यह है कि यह नई forEachविधि का समर्थन नहीं करती हैbreak जिसके कारण सभी प्रकार की अन्य समस्याएं पैदा हो गई हैं।

मूल रूप से 2011 में, जावास्क्रिप्ट में लूप करने का वास्तविक ठोस तरीका नहीं है, इसके अलावा कई लोकप्रिय पुस्तकालयों (jQuery, अंडरस्कोर, आदि) ने फिर से लागू करने का फैसला किया।

2015 तक, अब हमारे पास किसी भी प्रकार के ऑब्जेक्ट (अर्रेज़ और स्ट्रिंग्स सहित) को लूप (और ब्रेक) करने का बेहतर तरीका है। यहाँ है कि जावास्क्रिप्ट में एक लूप आखिरकार कैसा दिखेगा जब सिफारिश मुख्यधारा बन जाएगी:

for (let [key, value] of Object.entries(object)) {
    console.log(key); // This is the key;
    console.log(value); // This is the value;
}

ध्यान दें कि अधिकांश ब्राउज़र 18 जून 2016 तक कोड का समर्थन नहीं करेंगे। क्रोम में भी आपको काम करने के लिए इस विशेष ध्वज को सक्षम करने की आवश्यकता है: chrome://flags/#enable-javascript-harmony

जब तक यह नया मानक नहीं बन जाता, तब तक पुरानी पद्धति का उपयोग किया जा सकता है, लेकिन लोकप्रिय पुस्तकालयों में विकल्प भी हैं या उन लोगों के लिए हल्के विकल्प भी हैं जो इनमें से किसी भी पुस्तकालय का उपयोग नहीं कर रहे हैं।


आप इस काम का एक बेला प्रदान कर सकते हैं? यहाँ मेरा प्रयास है। jsfiddle.net/abalter/sceeb211
abalter

@abalter क्षमा करें मुझे एहसास हुआ कि मैं अपने कोड में एक टाइपो था। मैंने इसे ठीक किया और अपनी JsFiddle को यहां अपडेट किया: jsfiddle.net/sceeb211/2
निकोलस बुवरेट

मैं क्रोम में हूं और पा रहा हूं Uncaught TypeError: Object.entries is not a function। क्या यह क्रोम में अभी तक लागू नहीं हुआ है?
अबल्टर

@abalter यह है। सुनिश्चित करें कि आपके पास Chrome संस्करण 51 है और आपने मेरे संपादन और Jsfiddle टिप्पणियों में बताए अनुसार ध्वज को सक्षम किया है। आप यहाँ विवरण देख सकते हैं: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
निकोलस बउवरेट

खेद है कि मैंने ध्वज के बारे में याद किया। मैं देखता हूं कि यह अभी तक पूरी तरह से लागू की गई सुविधा नहीं है।
अबल्टर

5

ES6 में हमारे पास कुछ पूर्व आंतरिक तरीकों को उजागर करने के लिए प्रसिद्ध प्रतीक हैं, आप इसका उपयोग यह परिभाषित करने के लिए कर सकते हैं कि कैसे पुनरावृत्तियाँ इसके लिए काम करती हैं:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3",
    *[Symbol.iterator]() {
        yield *Object.keys(this);
    }
};

[...p] //["p1", "p2", "p3"]

यह es6 लूप में ... के लिए उपयोग के रूप में एक ही परिणाम देगा।

for(var key in p) {
    console.log(key);
}

लेकिन इसकी क्षमताओं को जानने के लिए महत्वपूर्ण है जो अब आप es6 का उपयोग कर रहे हैं!


1
एक कस्टम ऑब्जेक्ट इटरेटर एक सरणी के बिल्ट-इन एरे इटरेटर को कॉल करता है जो कि Object.keys()मेमोरी में उत्पन्न और आवंटित किया जाता है ... कूल!
OOO

5

मैं obj.hasOwnerPropertyहर for ... inलूप के भीतर जांच करने के बजाय ऐसा करूंगा ।

var obj = {a : 1};
for(var key in obj){
    //obj.hasOwnProperty(key) is not needed.
    console.log(key);
}
//then check if anybody has messed the native object. Put this code at the end of the page.
for(var key in Object){
    throw new Error("Please don't extend the native object");
}

5

    var p =[{"username":"ordermanageadmin","user_id":"2","resource_id":"Magento_Sales::actions"},
{"username":"ordermanageadmin_1","user_id":"3","resource_id":"Magento_Sales::actions"}]
for(var value in p) {
    for (var key in value) {
        if (p.hasOwnProperty(key)) {
            console.log(key + " -> " + p[key]);
        }
    }
}


json = [{"key1":"value1","key2":"value2"},{"key1":"value3","key2":"value4"}] for (var i = 0; i < json.length; i++) { for (var key in json[i]) { if (json[i].hasOwnProperty(key)) { console.log(key + " -> " + json[i][key]); } } }
मारेक बर्नार्ड

5

for-ofऑन का उपयोग करनाObject.keys()

पसंद:

let object = {
   "key1": "value1"
   "key2": "value2"
   "key3": "value3"
};

for (var key of Object.keys(p)) {
   console.log(key + " : " + object[key])
}

4

यदि आप गैर-एन्यूमरेबल प्रॉपर्टी पर भी पुनरावृति करना चाहते हैं , तो आप Object.getOwnPropertyNames(obj)किसी दिए गए ऑब्जेक्ट पर सीधे पाए जाने वाले सभी प्रॉपर्टी (एनुमेरेबल या नहीं) की एक सरणी वापस करने के लिए उपयोग कर सकते हैं ।

var obj = Object.create({}, {
  // non-enumerable property
  getFoo: {
    value: function() { return this.foo; },
    enumerable: false
  }
});

obj.foo = 1; // enumerable property

Object.getOwnPropertyNames(obj).forEach(function (name) {
  document.write(name + ': ' + obj[name] + '<br/>');
});


2
यह शानदार है, इस उत्तर को पोस्ट करने के लिए धन्यवाद। मुझे एक Errorवस्तु को आत्मसात करने की आवश्यकता थी और एक लूप या _.forIn(err)कॉल में गुणों पर प्राप्त नहीं कर सकता था । उपयोग Object.getOwnPropertyNames(err)करने से मुझे पहले के सभी हिस्सों का उपयोग करने की अनुमति मिली Errorजो मुझे पहले नहीं मिल सके। धन्यवाद!
पियर्स

4

अगर किसी को हालत के साथ arrayObjects के माध्यम से लूप करने की आवश्यकता है :

var arrayObjects = [{"building":"A", "status":"good"},{"building":"B","status":"horrible"}];

for (var i=0; i< arrayObjects.length; i++) {
  console.log(arrayObjects[i]);
  
  for(key in arrayObjects[i]) {      
    
      if (key == "status" && arrayObjects[i][key] == "good") {
        
          console.log(key + "->" + arrayObjects[i][key]);
      }else{
          console.log("nothing found");
      }
   }
}


4

ईएस 6 को ध्यान में रखते हुए मैं अपने स्वयं के चम्मच को जोड़ना चाहता हूं और ऑब्जेक्ट के गुणों पर पुनरावृति के लिए एक और दृष्टिकोण प्रदान करना चाहता हूं।

चूंकि सादा जे एस वस्तु नहीं है iterable अत्याधुनिक तरीके से, हम उपयोग नहीं कर पा रहे for..ofअपनी सामग्री पर पुनरावृत्ति के लिए पाश। लेकिन इसे चलने योग्य बनाने के लिए हमें कोई नहीं रोक सकता ।

हमें bookआपत्ति है।

let book = {
  title: "Amazing book",
  author: "Me",
  pages: 3
}

book[Symbol.iterator] = function(){

  let properties = Object.keys(this); // returns an array with property names
  let counter = 0;
  let isDone = false;

  let next = () => {
    if(counter >= properties.length){
      isDone = true;
    }
    return { done: isDone, value: this[properties[counter++]] }
  }

  return { next };
}

जब से हमने इसे बनाया है हम इसे इस तरह से उपयोग कर सकते हैं:

for(let pValue of book){
  console.log(pValue);
}
------------------------
Amazing book
Me
3

या यदि आप ईएस 6 जनरेटर की शक्ति जानते हैं , तो आप निश्चित रूप से कोड को बहुत कम कर सकते हैं।

book[Symbol.iterator] = function *(){

  let properties = Object.keys(this);
  for (let p of properties){
    yield this[p];
  }

}

यकीन है, आप सभी वस्तुओं के लिए इस तरह के व्यवहार Objectको prototypeस्तर पर चलने योग्य बनाने के साथ लागू कर सकते हैं ।

Object.prototype[Symbol.iterator] = function() {...}

इसके अलावा, पुनरावृत्त प्रोटोकॉल का पालन करने वाली वस्तुओं का उपयोग नए ES2015 फ़ीचर प्रसार ऑपरेटर के साथ किया जा सकता है, इस प्रकार हम ऑब्जेक्ट संपत्ति मानों को एक सरणी के रूप में पढ़ सकते हैं।

let pValues = [...book];
console.log(pValues);
-------------------------
["Amazing book", "Me", 3]

या आप विनाशकारी असाइनमेंट का उपयोग कर सकते हैं :

let [title, , pages] = book; // notice that we can just skip unnecessary values
console.log(title);
console.log(pages);
------------------
Amazing book
3

आप ऊपर दिए गए सभी कोड के साथ JSFiddle की जांच कर सकते हैं ।


मैंने पाया कि कोड मान उत्पन्न करेगा लेकिन बिना चाबी के। क्या कुंजी के साथ मूल्यों को पुनरावृत्त करना संभव है?
पिका

हाँ तुम कर सकते हो। बस "उपज [कुंजी, obj [कुंजी]];" अपने जनरेटर फ़ंक्शन से और फिर इसे "के लिए (जैसे [कुंजी, मूल्य]) {}) {}" के लिए निम्न का उपयोग करें
Artyom Pranovich

4

ES06 के बाद से आप किसी ऑब्जेक्ट के मान को सरणी के रूप में प्राप्त कर सकते हैं

let arrValues = Object.values( yourObject) ;

यह ऑब्जेक्ट मानों की एक सरणी लौटाता है और यह प्रोटोटाइप से मान नहीं निकालता है !!

MDN DOCS Object.values ​​()

और चाबी के लिए (पहले से ही मेरे सामने उत्तर दें)

let arrKeys   = Object.keys(yourObject);

उत्तर एक समाधान के लिए पूछता है जो कुंजी और मान दोनों को लौटाता है।
शॉन लिंडो

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