ES6 में मैप्स बनाम ऑब्जेक्ट्स, कब उपयोग करें?


83

Ref: एमडीएन मैप्स

जब रन टाइम तक कुंजियाँ अज्ञात हों, और जब सभी कुंजियाँ एक ही प्रकार की हों और सभी मान एक ही प्रकार के हों, तो उन ऑब्जेक्ट्स पर मैप्स का उपयोग करें।

ऑब्जेक्ट का उपयोग तब करें जब व्यक्तिगत तत्वों पर काम करने वाले तर्क हों।

सवाल:

ऑब्जेक्ट्स पर मैप्स का उपयोग करने का एक लागू उदाहरण क्या है? विशेष रूप से, "चाबियां कब तक अज्ञात रहेंगी?"

var myMap = new Map();

var keyObj = {},
    keyFunc = function () { return 'hey'},
    keyString = "a string";

// setting the values
myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

console.log(myMap.get(keyFunc));

हाँ मैंने उस पर ध्यान दिया। जैसा कि मैंने एक फ़ंक्शन को मान के रूप में सेट किया है। @JonathanLonowski क्या आप सोच सकते हैं कि मुझे कब करना चाहिए :( यह usecases की कठिन सोच है।
मैथ्यू

7
आप इसका उपयोग कर सकते हैं जहाँ आपके पास एक DOM तत्व है जिसे आप किसी ऑब्जेक्ट का उपयोग करके कुछ डेटा को जोड़ना चाहते हैं। उपयोग करने के बजाय, एक तत्व में कुंजी के रूप में तत्व की आईडी कहें, आप तत्व को मानचित्र में एक कुंजी के रूप में उपयोग कर सकते हैं, इसलिए आपको परवाह नहीं है कि तत्व में एक आईडी (या ऑब्जेक्ट संदर्भ के अलावा कोई अन्य विशिष्ट पहचानकर्ता) है या नहीं ) या नहीं।
रोबग

1
@RobG सिर्फ एक छोटा सा जोड़ है: उस मामले में यह एक WeakMapसहायक भी हो सकता है।
zerkms

1
मुझे लगता है कि यह ऑब्जेक्ट्स को रिकॉर्ड के लिए और मैप्स के रूप में उपयोग करने के लिए सुझाव देता है। रिकॉर्ड्स के साथ मेरा मतलब है एक डेटा सेट फ़ील्ड का एक निश्चित सेट, जैसे कि उपयोगकर्ता ऑब्जेक्ट जिसमें फ़ील्ड्स हैं nameऔर idउदाहरण के लिए।
फेलिक्स क्लिंग

1
जब मैं उस एमडीएन पृष्ठ को पढ़ रहा था, तो आपके द्वारा उद्धृत पैराग्राफ की तुलना में उपयोग के मामलों की बुलेट-पॉइंट सूची बहुत अधिक सहायक थी। निश्चित रूप से आपके शीर्षक में प्रस्तुत प्रश्न के संबंध में।
कोडिंगइंट्रिग्यू

जवाबों:


51

ऑब्जेक्ट्स पर मैप्स का उपयोग करने का एक लागू उदाहरण क्या है?

मुझे लगता है कि आपने पहले से ही एक अच्छा उदाहरण दिया है: आपको कम से कम Mapएस का उपयोग करने की आवश्यकता है जब आप ऑब्जेक्ट (फ़ंक्शन ऑब्जेक्ट्स सहित) को कुंजी के रूप में उपयोग कर रहे हैं।

विशेष रूप से, "चाबियां कब तक अज्ञात रहेंगी?"

जब भी संकलन के समय उनका पता नहीं चलता। संक्षेप में, आपको हमेशा Mapएक कुंजी-मूल्य संग्रह की आवश्यकता होने पर उपयोग करना चाहिए । एक अच्छा संकेतक जिसे आपको एक संग्रह की आवश्यकता होती है, जब आप मूल्यों को गतिशील रूप से संग्रह से जोड़ते हैं और निकालते हैं, और विशेष रूप से जब आप पहले से उन मूल्यों को नहीं जानते हैं (जैसे वे डेटाबेस से पढ़े जाते हैं, उपयोगकर्ता द्वारा इनपुट, आदि)।

इसके विपरीत, आपको वस्तुओं का उपयोग तब करना चाहिए जब आपको पता हो कि कोड लिखते समय ऑब्जेक्ट में कौन सी और कितनी संपत्तियां हैं - जब उनका आकार स्थिर है। जैसा कि @ फेलिक्स ने डाल दिया है: जब आपको रिकॉर्ड की आवश्यकता होती है । जरूरतों के लिए एक अच्छा संकेतक वह है जब खेतों में विभिन्न प्रकार होते हैं, और जब आपको ब्रैकेट नोटेशन का उपयोग करने की आवश्यकता नहीं होती है (या इसमें संपत्ति के नाम के सीमित सेट की उम्मीद है)।


1
या किसी अन्य दृष्टिकोण से: जब भी आपको for..ofप्रोग्राम स्तर (जैसे for..in) के बजाय डेटा स्तर (जैसे ) पर अपनी ऑब्जेक्ट की संपत्तियों पर पुनरावृति करने की आवश्यकता हो (जैसे ) एक का उपयोग करें Mapइस प्रतिक्रिया में इस शब्द से संबंधित अधिक जानकारी ।

मैं तथ्य यह है कि किसी भी समय आप प्रकार की तरह है जो आपके लिए महत्वपूर्ण हो जाएगा पता नहीं है टिप्पणी के रूप में भी जोड़ देगा और आप कुंजी डेटा प्रकार, तो उपयोग नक्शे के रूप में स्ट्रिंग की उम्मीद नहीं है stackoverflow.com/questions/32600157/...
कारमाइन Tambascia

26

मुझे लगता है कि ES2015 के साथ Mapसादे वस्तुओं का उपयोग करने के केवल दो कारण बचे हैं:

  • आप किसी ऑब्जेक्ट प्रकार के गुणों से अधिक पुनरावृति नहीं करना चाहते हैं
  • या आप करते हैं, लेकिन संपत्ति क्रम मायने नहीं रखता है और आप प्रोग्राम को डेटा स्तर से पुनरावृत्ति कर सकते हैं

संपत्ति आदेश कब महत्वहीन है?

  • आप केवल एक ही मूल्य और कुछ कार्यों कि इसके साथ स्पष्ट रूप से संबद्ध किया जाना चाहिए है (जैसे Promise- जो एक भविष्य मूल्य के लिए एक प्रॉक्सी है - और then/ catch)
  • यदि आपके पास "संकलित समय" में ज्ञात गुणों के स्थिर सेट के साथ एक संरचना / रिकॉर्ड जैसी डेटा संरचना है (आमतौर पर संरचनाएं / रिकॉर्ड पुनरावृत्त नहीं हैं)

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

की कमियां क्या हैं Map?

  • आप संक्षिप्त वस्तु शाब्दिक वाक्य रचना खो देते हैं
  • आपको JSON.stringyfy के लिए कस्टम प्रतिकृति की आवश्यकता है
  • आप विनाशकारी खो देते हैं, जो वैसे भी स्थैतिक डेटा संरचनाओं के साथ अधिक उपयोगी है

यह पंक्ति मुझे बहुत चिंतित करती है: "यह शायद शुद्ध, हैशमाप जैसी वस्तुओं की तुलना में धीमी है" मैंने प्रदर्शन में सुधार के कारण अपने सभी वस्तुओं को नक्शे के साथ बदलने के बारे में सोचा। लेकिन आप कहते हैं कि यह धीमी है ...
mesqueeb

1
आप सही हे। Mapशायद अधिक तेज़ है, क्योंकि यह शुद्ध रूप से हैश पर आधारित है, जबकि Objectथोड़ा अधिक जटिल है। धन्यवाद!

11

जब रन टाइम तक कुंजियाँ अज्ञात हों, और जब सभी कुंजियाँ एक ही प्रकार की हों और सभी मान एक ही प्रकार के हों, तो उन ऑब्जेक्ट्स पर मैप्स का उपयोग करें।

मुझे नहीं पता कि कोई क्यों कुछ स्पष्ट रूप से गलत लिखेगा। मुझे कहना है, इन दिनों एमडीएन पर लोग अधिक से अधिक गलत और / या संदिग्ध सामग्री पा रहे हैं।

उस वाक्य में कुछ भी सही नहीं है। नक्शे का उपयोग करने का मुख्य कारण यह है कि जब आप ऑब्जेक्ट-वैल्यू कीज चाहते हैं। यह विचार कि मूल्य समान होने चाहिए, बेतुका है - हालाँकि वे हो सकते हैं, बेशक। विचार है कि किसी को वस्तुओं का उपयोग नहीं करना चाहिए जब चाबियाँ अज्ञात होती हैं जब तक कि रन टाइम समान रूप से बेतुका नहीं होता है।


1
मुझे नहीं पता कि विचार के बारे में क्या बेतुका है? जब आपको संग्रह की आवश्यकता होती है, तो वे आम तौर पर कड़ाई से टाइप किए जाते हैं (अपवाद हो सकते हैं, निश्चित रूप से)। इसके अलावा, मुझे लगता है कि संग्रह (जब Mapउपलब्ध हो) के लिए वस्तुओं का उपयोग नहीं करना अच्छी सलाह है।
बरगी

उस संग्रह के लिए आमतौर पर कड़ाई से टाइप किया जाता है, यह कहने के लिए तार्किक रूप से अलग है कि कड़ाई से टाइप की गई चीज़ का संग्रह होना चाहिए।

1
हाँ, मुझे लगता है कि यह थोड़ा अजीब है, लेकिन विचार ठीक है। मुझे लगता है कि उन्हें लगा कि "चाबियाँ अज्ञात हैं जब तक कि रन टाइम" पहले से ही एक संग्रह बनाता है। एक बेहतर phrasing के लिए कोई विचार?
बरगी

1
माना। एमडीएन के पास बहुत अच्छे दस्तावेज हैं, लेकिन उन्हें एपीआई डॉक्स का दस्तावेजीकरण करना चाहिए और प्रोग्रामिंग सलाह देने की कोशिश नहीं करनी चाहिए।
एलेक्स जीएन

5

के बीच अंतर में से एक Mapऔर Objectहै:

Mapइसकी कुंजी के रूप में जटिल डेटा प्रकार का उपयोग कर सकते हैं। इस तरह:

const fn = function() {}
const m = new Map([[document.body, 'stackoverflow'], [fn, 'redis']]);

m.get(document.body) // 'stackoverflow'
m.get(fn) //'redis'

बाहर देखें: जटिल डेटा प्रकार के लिए, यदि आप मान प्राप्त करना चाहते हैं, तो आपको कुंजी के समान संदर्भ पास करना होगा।

Object, यह केवल साधारण डेटा प्रकार ( number, string) को अपनी कुंजी के रूप में स्वीकार करता है।

const a = {};
a[document.body] = 'stackoverflow';

console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}

2

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

अन्य उत्तरों के अलावा, मैंने पाया है कि मैप्स वस्तुओं की तुलना में अधिक अस्पष्ट और क्रियात्मक हैं।

obj[key] += x
// vs.
map.set(map.get(key) + x)

यह महत्वपूर्ण है, क्योंकि कम कोड पढ़ने के लिए तेज़ है, अधिक सीधे अभिव्यंजक है, और प्रोग्रामर के सिर में बेहतर रखा गया है

एक अन्य पहलू: क्योंकि सेट () मैप लौटाता है, मूल्य नहीं, यह चेन असाइनमेंट के लिए असंभव है।

foo = obj[key] = x;  // Does what you expect
foo = map.set(key, x)  // foo !== x; foo === map

नक्शे को डीबग करना भी अधिक दर्दनाक है। नीचे, आप वास्तव में यह नहीं देख सकते कि नक्शे में क्या कुंजियाँ हैं। आपको ऐसा करने के लिए कोड लिखना होगा।

सौभाग्य एक मैप Iterator का मूल्यांकन

वस्तुओं का मूल्यांकन किसी भी IDE द्वारा किया जा सकता है:

किसी ऑब्जेक्ट का मूल्यांकन करने वाला WebStorm


6
यह इस सवाल का जवाब नहीं देता है कि " वस्तुओं पर नक्शों का उपयोग करने का एक लागू उदाहरण क्या है? "
बर्गी

6
कृपया अपने उत्तर क्रॉस-पोस्ट न करें। और नहीं, प्रश्न डुप्लिकेट नहीं है।
बरगी

1

Objects इस तरह से हैं Mapकि दोनों आपको मानों की कुंजी सेट करने देते हैं, उन मानों को पुनः प्राप्त करते हैं, कुंजियों को हटाते हैं, और पता लगाते हैं कि क्या किसी कुंजी में संग्रहीत है। इस वजह से (और क्योंकि कोई अंतर्निहित विकल्प नहीं थे), Objects का उपयोग Mapऐतिहासिक रूप से किया गया है ; हालाँकि, महत्वपूर्ण अंतर हैं जो Mapकुछ मामलों में बेहतर उपयोग करते हैं:

  • एक की कुंजी Objectहैं Stringऔर Symbol, रों जबकि वे एक के लिए किसी भी मूल्य हो सकता है Mapकाम करता है, वस्तुओं, और किसी भी आदिम भी शामिल है।
  • कुंजी में Mapआदेश दिए गए हैं जबकि ऑब्जेक्ट में जोड़े गए कुंजी नहीं हैं। इस प्रकार, जब इस पर पुनरावृत्ति होती है, तो Mapऑब्जेक्ट प्रविष्टि के क्रम में कुंजियाँ लौटाता है।
  • आप संपत्ति के Mapसाथ आसानी से आकार प्राप्त कर सकते sizeहैं, जबकि गुणों की संख्या Objectमैन्युअल रूप से निर्धारित की जानी चाहिए।
  • A Mapएक चलने-फिरने योग्य है और इस प्रकार इसे सीधे-सीधे पुनरावृत्त किया जा सकता है, जबकि Objectकुछ में इसकी कुंजी प्राप्त करने की आवश्यकता होती है और कुछ इस पर चलना।
  • एक Objectप्रोटोटाइप है, इसलिए मानचित्र में डिफ़ॉल्ट कुंजियाँ हैं जो आपकी कुंजियों से टकरा सकती हैं यदि आप सावधान नहीं हैं। ES5 के रूप में इसका उपयोग करके बाईपास किया जा सकता है map = Object.create(null), लेकिन यह शायद ही कभी किया जाता है।
  • A ऐसे Mapपरिदृश्यों में बेहतर प्रदर्शन कर सकता है, जिनमें प्रमुख जोड़ियों को बार-बार जोड़ना और हटाना शामिल है।

MDN

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