ES6 मानचित्र का उपयोग करने में कोई बिंदु जब चाबियाँ सभी तार हैं?


36

प्लेन ऑब्जेक्ट कीज़ को स्ट्रिंग्स होना चाहिए, जबकि Mapइसमें किसी भी प्रकार की कुंजी हो सकती है।

लेकिन व्यवहार में इसके लिए मेरे पास बहुत कम उपयोग है। लगभग सभी मामलों में, मैं खुद को चाबी के रूप में स्ट्रिंग्स का उपयोग कर पाता हूं। और संभवतः new Map()से धीमी है {}। तो क्या कोई अन्य कारण है कि Mapएक सादे वस्तु के बजाय इसका उपयोग करना बेहतर हो सकता है ?


3
हमेशा की तरह एमडीएन की तुलना अच्छी है।
क्रिस हेस

1
FYI करें, मानचित्र सेटिंग और प्राप्त करने दोनों के लिए तेज़ प्रतीत होता है
एमपीएन

@mpen - jsperf अभी नीचे है। क्या आप निश्चित map.set('foo', 123)रूप से तेज प्रदर्शन कर रहे हैं obj.foo = 123? यदि ऐसा है तो बहुत आश्चर्य की बात है
कॉल

@callum Uhh..no, सकारात्मक नहीं। आप कुछ नए प्रदर्शन परीक्षण लिखना चाह सकते हैं।
मपेन सेप

जवाबों:


42

कुछ कारण हैं कि मैं रनटाइम डेटा (कैश, आदि) के भंडारण के लिए Mapसादे वस्तुओं ( {}) पर उपयोग करना पसंद करता हूं :

  1. .sizeसंपत्ति मुझे पता है कि कितने प्रविष्टियों इस मानचित्र में मौजूद सुविधा देता है;
  2. विभिन्न उपयोगिता तरीकों - .clear(), .forEach(), आदि;
  3. वे मुझे डिफ़ॉल्ट रूप से पुनरावृत्तियों प्रदान करते हैं!

हर दूसरे मामले, जैसे कि फ़ंक्शन तर्कों को पास करना, कॉन्फ़िगरेशन को स्टोर करना और आदि, सभी सादे वस्तुओं का उपयोग करके लिखे गए हैं।

इसके अलावा, याद रखें: अपने कोड को बहुत जल्दी ऑप्टिमाइज़ करने का प्रयास न करें। जब तक आपका प्रोजेक्ट प्रदर्शन समस्याओं से पीड़ित नहीं है, तब तक अपना समय सादे ऑब्जेक्ट बनाम मैप्स के मानदंड बनाने में बर्बाद न करें।


1
जावास्क्रिप्ट द्वारा प्रयुक्त पहचान हैशकोड फ़ंक्शन क्या है?
पेसियर

1
@ स्पेसर ===:)
१२'१av दिन

इन दिनों नक्श सादे वस्तुओं की तुलना में बहुत तेज हैं।
जयरजो

@gustavohenke यह सच नहीं है। MapSameValueZero एल्गोरिथ्म का उपयोग करता है। developer.mozilla.org/en-US/docs/Web/JavaScript/…
lolmaus - एंड्री मिखायलोव

@ lolmaus-AndreyMikhaylov ठीक है, लेकिन क्या मैंने Mapइस या उस का उपयोग करने के बारे में कुछ कहा?
शाम

4

मुझे इस पर यकीन नहीं है, लेकिन मुझे लगता है कि प्रदर्शन मैप्स का उपयोग करने का एक कारण नहीं है। इस अपडेट किए गए jsperf पृष्ठ पर एक नज़र डालें:

http://jsperf.com/es6-map-vs-object-properties/73

ऐसा लगता है कि (जब कम से कम तार से निपटने के लिए) ऑब्जेक्ट मूल सेटिंग और प्राप्त करने के लिए नक्शे की तुलना में बहुत तेज होते हैं।


2
यह नहीं है कि आप प्रदर्शन परीक्षण कैसे लिखते हैं।
Qix

6
यही नहीं आप उपयोगी टिप्पणियां कैसे लिखते हैं। यदि आपको सुझाव देने के लिए कोई वैकल्पिक पद्धति है, तो कृपया विस्तार से बताएं। क्या, विशेष रूप से, गलत है कि उन परीक्षणों को कैसे लिखा गया था? क्या वे किसी भी तरह से अमान्य या अयोग्य हैं?
Starlogodaniel

9
माइक्रोबैनचर्च के माध्यम से परीक्षण किए जा रहे भाषा शब्दार्थ / निर्माण केवल एक चर द्वारा भिन्न होने चाहिए। आपके परीक्षण पुनरावृत्तियों की संख्या में भिन्न होते हैं, और उनमें से कुछ में उनके आंतरिक लूप सामग्री को अनुकूलित किया जाएगा क्योंकि परिणाम अप्रयुक्त है। कुछ परीक्षण पूर्व-घोषित चरों को दिखाते हैं जबकि अन्य में लूप के लिए वैरिएबल डिक्लेरेशन इनलाइन होता है - जो विभिन्न प्रदर्शन असामान्यताएं पैदा कर सकता है।
Qix

1
आहा, तुम बिलकुल सही हो। मेरे बचाव में, मेरे संस्करण को इससे पहले एक पर एक सुधार था, लेकिन मैंने पूर्व-घोषणा और आंतरिक लूप सामग्री दोनों को याद किया। मैं एक सहयोगी के साथ काम कर रहा था जो मेरे मसौदे में सुधार हुआ और मुझे लगता है कि उन मुद्दों को हल किया गया है: jsperf.com/es6-map-vs-object-properties/88 । हालांकि, मुझे लगता है कि विभिन्न डेटा संरचनाओं के लिए अलग-अलग लूप शैलियों का होना वैध है; वास्तविक उपयोग में, लोग सर्वश्रेष्ठ प्रदर्शन के साथ लूप संरचना का चयन करेंगे, और मैप और ऑब्जेक्ट में अलग-अलग "इष्टतम" लूप संरचनाएं हैं। वैसे भी, पकड़ने के लिए धन्यवाद।
स्टारलोगोडैनियल

ठीक है अब मैं देख रहा हूं - वे सादे वस्तुओं की तुलना में धीमे होते थे, लेकिन हाल के ब्राउज़रों में भारी अनुकूलित किए गए हैं।
जयरोज़

0

अन्य उत्तर वस्तुओं और Maps के बीच एक अंतिम अंतर का उल्लेख नहीं करते हैं :

Mapवस्तु कुंजी-मान जोड़ों रखती है और चाबियों का मूल प्रविष्टि आदेश में याद करते हैं

इस प्रकार, जब इस पर पुनरावृत्ति होती है, तो एक मैप ऑब्जेक्ट प्रविष्टि के क्रम में चाबियाँ देता है।

से उद्धरण MDN , जोर मेरा


यह मुख्य कारण था जो मैंने Mapहाल ही में किसी परियोजना में पहली बार उपयोग करने का निर्णय लिया । मेरे पास एक सामान्य वस्तु थी जिसे मुझे <table>एक विशिष्ट पंक्ति में प्रत्येक संपत्ति के साथ प्रदर्शित करने की आवश्यकता थी ।

let productPropertyOrder = [ "name", "weight", "price", "stocked" ];

let product =
{
    name: "Lasagne",
    weight: "1kg",
    price: 10,
    stocked: true
}

मैंने Mapकिसी इच्छित कुंजी क्रम के अनुसार किसी वस्तु को रूपांतरित करने के लिए एक फ़ंक्शन लिखा :

function objectToMap( obj, order )
{
    let map = new Map();

    for ( const key of order )
    {
        if ( obj.hasOwnProperty( key ) )
        {
            map.set( key, obj[ key ] );
        }
    }

    return map;
}

तब नक्शा वांछित क्रम में पुन: प्रसारित किया जा सकता है:

let productMap = objectToMap( product, productPropertyOrder );

for ( const value of productMap.values() )
{
    let cell = document.createElement( "td" );
    cell.innerText = value;
    row.appendChild( cell );
}

निश्चित रूप से यह थोड़ा विरोधाभास है क्योंकि Mapइस प्रक्रिया में निर्माण के बिना संपत्ति के आदेश पर पुनरावृति होने पर कोई भी अच्छा प्रदर्शन कर सकता है:

for ( const key of productPropertyOrder )
{
    if ( product.hasOwnProperty( key ) )
    {
        let value = product[ key ];
        // create cell
    }
}

लेकिन अगर आपके पास ऐसी वस्तुओं की एक सरणी है और उन्हें कई स्थानों पर प्रदर्शित करने जा रहे हैं, तो उन सभी को पहले नक्शे में परिवर्तित करना समझ में आता है।

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