ES6 মানচিত্রটি ব্যবহার করার কোনও পয়েন্ট কীগুলি সমস্ত স্ট্রিং থাকে?


36

সরল অবজেক্ট কীগুলির অবশ্যই স্ট্রিং থাকতে হবে, যেখানে Mapএকটিতে যে কোনও ধরণের কী থাকতে পারে ।

তবে অনুশীলনে আমার এর ব্যবহার খুব কম। প্রায় সব ক্ষেত্রেই আমি নিজেকে কী হিসাবে কী হিসাবে স্ট্রিংগুলি ব্যবহার করতে দেখি। এবং সম্ভবত new Map()তুলনায় ধীর {}। সুতরাং অন্য কোনও কারণ আছে কেন এটি Mapপ্লেইন অবজেক্টের পরিবর্তে ব্যবহার করা ভাল ?


3
এমডিএন যথারীতি তুলনামূলক ভাল।
ক্রিস হেইস

1
এফওয়াইআই, মানচিত্র সেটিংস এবং প্রাপ্ত উভয়ের জন্যই দ্রুত বলে মনে হচ্ছে।
এমপেন

@ এমপেন - জেএসপিআফ এখন নিচে। আপনি কি নিশ্চিত যে এর map.set('foo', 123)চেয়ে দ্রুত সম্পাদন করেছেন obj.foo = 123? যদি তা খুব অবাক হয়
কলম্ব

@ কলম উহ..না, ইতিবাচক নয়। আপনি কিছু নতুন পারফরম্যান্স পরীক্ষা লিখতে চাইতে পারেন।
এমপেন

উত্তর:


42

রানটাইম ডেটা (ক্যাশে ইত্যাদির জন্য) সংরক্ষণ করার জন্য আমি Mapপ্লেইন অবজেক্টগুলির ( {}) বেশি ব্যবহার করার পছন্দ করার কিছু কারণ রয়েছে :

  1. .sizeসম্পত্তি আমাকে জানতে কত এন্ট্রি এই মানচিত্রটি মধ্যে উপস্থিত দেয়;
  2. বিভিন্ন ইউটিলিটি পদ্ধতি - .clear(), .forEach()ইত্যাদি;
  3. তারা আমাকে ডিফল্টরূপে পুনরাবৃত্তি সরবরাহ করে!

প্রতিটি অন্যান্য ক্ষেত্রে যেমন ফাংশন আর্গুমেন্টগুলি পাস করা, সংরক্ষণের কনফিগারেশন এবং ইত্যাদি, সবগুলি সরল অবজেক্ট ব্যবহার করে লেখা are

এছাড়াও, মনে রাখবেন: খুব শীঘ্রই আপনার কোডটি অপ্টিমাইজ করার চেষ্টা করবেন না। আপনার প্রকল্পের পারফরম্যান্স সমস্যা না ভেবে প্লেইন অবজেক্ট বনাম মানচিত্রের বেঞ্চমার্কগুলি করতে আপনার সময় নষ্ট করবেন না।


1
জাভাস্ক্রিপ্ট দ্বারা ব্যবহৃত হ্যাশকোড ফাংশনটি কী?
পেসারিয়ার

1
@ পেসারিয়র ===:)
গুস্তাভোহেঙ্কে

এই দিনগুলিতে মানচিত্রগুলি সরল বস্তুর তুলনায় অনেক দ্রুত।
জয়য়ারজো

@ গুস্তাভোহেঙ্কে এটি সত্য নয় Mapসেমভেলিউজিরো অ্যালগরিদম ব্যবহার করে। বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

@ লোলমাস-আন্দ্রে মিখায়লোভ ঠিক আছে, তবে আমি Mapএই বা এটি ব্যবহার করার বিষয়ে কিছু বললাম ?
গুস্তাভোহনেকে

4

আমি এ সম্পর্কে নিশ্চিত নই, তবে আমি মনে করি যে মানচিত্র ব্যবহারের কোনও কারণ নয় performance এই আপডেট হওয়া jsperf পৃষ্ঠাটি একবার দেখুন:

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

দেখে মনে হচ্ছে (কমপক্ষে স্ট্রিংয়ের সাথে কাজ করার সময়) অবজেক্টগুলি বেসিক সেটিং এবং পাওয়ার মানচিত্রের চেয়ে অনেক দ্রুত faster


2
আপনি পারফরম্যান্স টেস্টগুলি কীভাবে লেখেন তা নয়।
কিউস

6
আপনি দরকারী মন্তব্য লিখতে না যে এটি। পরামর্শ দেওয়ার মতো বিকল্প পদ্ধতি থাকলে আপনার কাছে বিনা দ্বিধা বোধ করবেন। বিশেষত কীভাবে এই পরীক্ষাগুলি লেখা হয়েছিল তাতে ভুল? এগুলি কি কোনওভাবেই অবৈধ বা অসহায়?
স্টারলোগোডানিয়েল

9
মাইক্রোব্যাঙ্কমার্কের মাধ্যমে পরীক্ষিত ভাষা শব্দার্থ / গঠনসমূহ কেবল একটি পরিবর্তনশীল দ্বারা পৃথক হওয়া উচিত। আপনার পরীক্ষাগুলি পুনরাবৃত্তির সংখ্যা জুড়ে পরিবর্তিত হয় এবং ফলাফলটি অব্যবহৃত হওয়ায় তাদের মধ্যে কয়েকটিতে তাদের অভ্যন্তরীণ লুপ সামগ্রী অপ্টিমাইজ করা থাকে। কিছু পরীক্ষায় ভেরিয়েবলগুলি প্রাক-ঘোষিত থাকে আবার অন্যদের সাথে লুপের সাথে ভেরিয়েবল ডিক্লেয়ারেশন ইনলাইন থাকে - এতে বিভিন্ন পারফরম্যান্স অস্বাভাবিকতা থাকতে পারে।
কিউস

1
ওহ, আপনি একেবারে ঠিক বলেছেন। আমার প্রতিরক্ষার ক্ষেত্রে, আমার সংস্করণটি এর আগেরটির চেয়ে উন্নতি হয়েছিল, তবে আমি প্রাক-ঘোষিত এবং অভ্যন্তরীণ লুপ সামগ্রীগুলি অপ্টিমাইজড হওয়া উভয়ই মিস করেছি। আমি একজন সহকর্মী যারা আমার খসড়া উপর উন্নত সঙ্গে কাজ করা হয় এবং আমি ঐ সমস্যা সমাধান চিন্তা করুন: jsperf.com/es6-map-vs-object-properties/88 । তবে আমি মনে করি যে বিভিন্ন ডেটা স্ট্রাকচারের জন্য আলাদা লুপ স্টাইল থাকা বৈধ; আসল ব্যবহারে, লোকেরা সর্বোত্তম পারফরম্যান্সের সাথে লুপ কাঠামোটি বেছে নেবে এবং মানচিত্র এবং অবজেক্টের আলাদা "অনুকূল" লুপ কাঠামো রয়েছে। যাইহোক, ধরার জন্য ধন্যবাদ।
স্টারলোগোডানিয়েল

ঠিক আছে আমি এখন দেখতে পাচ্ছি - এগুলি সরল বস্তুর তুলনায় ধীর ছিল, তবে সাম্প্রতিক ব্রাউজারগুলিতে ভারী অনুকূলিত হয়েছে।
জয়য়ারজো

0

অন্যান্য উত্তরগুলি বস্তু এবং Mapগুলিগুলির মধ্যে একটি শেষ পার্থক্য উল্লেখ করে না :

Mapবস্তু কী-মান জোড়া ঝুলিতে এবং কি মূল সন্নিবেশ অর্ডার স্মরণ

সুতরাং, এটির উপরে পুনরাবৃত্তি করার সময়, একটি মানচিত্র অবজেক্ট সন্নিবেশ অনুসারে কীগুলি ফিরিয়ে দেয়।

এমডিএন থেকে উদ্ধৃতি , জোর আমার


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

তবে যদি আপনার কাছে এই জাতীয় অবজেক্টগুলির একটি অ্যারে থাকে এবং সেগুলি অনেকগুলি স্থান প্রদর্শন করে চলেছে, তবে সেগুলি প্রথমে মানচিত্রে রূপান্তর করা অর্থবোধ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.