জাভাস্ক্রিপ্টে মানচিত্র বনাম অবজেক্ট


289

আমি সবেমাত্র chromestatus.com আবিষ্কার করেছি এবং, আমার দিনের বেশ কয়েক ঘন্টা হারানোর পরে, এই বৈশিষ্ট্যটির এন্ট্রিটি পেয়েছি :

মানচিত্র: মানচিত্রের অবজেক্টগুলি সাধারণ কী / মান মানচিত্র।

আমাকে বিভ্রান্ত করেছে। নিয়মিত জাভাস্ক্রিপ্ট অবজেক্টগুলি অভিধান হয়, তবে অভিধান Mapথেকে আলাদা কীভাবে ? ধারণাগতভাবে, তারা অভিন্ন ( মানচিত্র এবং অভিধানের মধ্যে পার্থক্য কী অনুসারে ? )

ডকুমেন্টেশন ক্রোমাস্ট্যাটাস রেফারেন্সগুলি কোনওভাবেই সহায়তা করে না:

মানচিত্রের অবজেক্টগুলি কী / মান জোড়ার সংকলন যেখানে কী এবং মান উভয়ই নির্বিচারে ECMAScript ভাষার মান হতে পারে। মানচিত্রের সংগ্রহের মধ্যে একটি পৃথক কী মান কেবল একটি কী / মান জোড়ায় উপস্থিত হতে পারে। মানচিত্র তৈরি করার সময় নির্বাচন করা হয় এমন তুলনা অ্যালগরিদম ব্যবহার করে বৈষম্য হিসাবে মূল মানগুলি পৃথক করুন।

একটি মানচিত্র অবজেক্ট তার উপাদানগুলি সন্নিবেশ ক্রমে পুনরাবৃত্তি করতে পারে। ম্যাপ অবজেক্টটি হ্যাশ টেবিল বা অন্যান্য প্রক্রিয়াগুলি প্রয়োগ করে অবশ্যই প্রয়োগ করা উচিত যা সংগ্রহের উপাদানগুলির সংখ্যার উপর ভিত্তি করে অ্যাক্সেসের সময়গুলি অন্তর্ভুক্ত থাকে sub এই মানচিত্রের অবজেক্টগুলির নির্দিষ্টকরণে ব্যবহৃত ডেটা স্ট্রাকচারগুলি কেবল মানচিত্রের অবজেক্টগুলির প্রয়োজনীয় পর্যবেক্ষণযোগ্য শব্দার্থবিজ্ঞানের বর্ণনা দেওয়ার জন্য। এটি একটি কার্যকর বাস্তবায়ন মডেল হওয়ার উদ্দেশ্যে নয়।

… এখনও আমার কাছে অবজেক্টের মতো মনে হচ্ছে, তাই স্পষ্টভাবে আমি কিছু মিস করেছি।

কেন জাভাস্ক্রিপ্ট একটি (ভাল-সমর্থিত) Mapবস্তু অর্জন করছে ? এটার কাজ কি?


উত্তর:


284

মজিলার মতে:

মানচিত্রের অবজেক্টটি তার উপাদানগুলি সন্নিবেশ ক্রমে পুনরাবৃত্তি করতে পারে - একটি for..of লুপ প্রতিটি পুনরাবৃত্তির জন্য [কী, মান] এর অ্যারে প্রদান করবে।

এবং

অবজেক্টস মানচিত্রের সমান যা উভয়ই আপনাকে মানগুলির জন্য কীগুলি সেট করতে দেয়, সেই মানগুলি পুনরুদ্ধার করতে, কীগুলি মুছতে এবং কোনও কীতে কোনও সঞ্চিত আছে কিনা তা সনাক্ত করতে দেয়। এর কারণে, অবজেক্টগুলি Mapsতিহাসিকভাবে মানচিত্র হিসাবে ব্যবহৃত হয়েছে; তবে, অবজেক্টস এবং মানচিত্রের মধ্যে গুরুত্বপূর্ণ পার্থক্য রয়েছে যা মানচিত্রকে আরও ভাল করে তোলে।

একটি অবজেক্টের একটি প্রোটোটাইপ রয়েছে, তাই মানচিত্রে ডিফল্ট কী রয়েছে। তবে মানচিত্র = অবজেক্ট.ক্রিয়েট (নাল) ব্যবহার করে এটিকে বাইপাস করা যায়। কোনও অবজেক্টের কীগুলি স্ট্রিংস, যেখানে সেগুলি মানচিত্রের যে কোনও মান হতে পারে। আপনাকে কোনও মানচিত্রের আকার সহজেই পেতে পারেন যখন আপনাকে কোনও বস্তুর জন্য ম্যানুয়ালি আকারের ট্র্যাক রাখতে হয়।

রান সময় পর্যন্ত কীগুলি অজানা থাকে এবং যখন সমস্ত কী একই ধরণের হয় এবং সমস্ত মান একই ধরণের হয় তখন অবজেক্টগুলির উপরে মানচিত্র ব্যবহার করুন।

যখন যুক্তি থাকে যা পৃথক উপাদানগুলিতে চালিত হয় তখন অবজেক্টগুলি ব্যবহার করুন।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

পুনরুক্তি-ইন-অর্ডার এমন একটি বৈশিষ্ট্য যা অনেক আগে থেকেই বিকাশকারীদের চেয়েছিল, কারণ এটি সমস্ত ব্রাউজারে একই কার্যকারিতা নিশ্চিত করে। আমার কাছে তাই বড়।

myMap.has(key)পদ্ধতি বিশেষত কুশলী, এবং এছাড়াও হতে হবে myMap.sizeসম্পত্তি।


13
একটি নেতিবাচক ধারণা, সম্ভবত, সন্নিবেশ ক্রম বজায় রাখতে মানচিত্রে আরও মেমরির প্রয়োজন (যদিও প্রস্থের একই ক্রমের মধ্যে)।
জন কুরলাক

4
মানচিত্রে অর্ডারেন্সের পাশাপাশি অন্যান্য বৈশিষ্ট্য রয়েছে যা এখানে বর্ণিত হয়েছে (কোনও কীটিকে কোনও কী হিসাবে ব্যবহার করা হবে, কী এবং প্রপস পৃথককরণ ইত্যাদি), তবে FWIW কিছু ক্ষেত্রে প্লেইন অবজেক্ট বৈশিষ্ট্যের পুনরাবৃত্তি ক্রম ES2015 দ্বারা সংজ্ঞায়িত করা হয়। Stackoverflow.com/a/32149345 দেখুন ।
জেএমএম

2
আমি অর্থটি পেলাম না, যখন আপনি বলবেন যে কোনও বস্তুর একটি প্রোটোটাইপ রয়েছে, সুতরাং মানচিত্রে ডিফল্ট কী রয়েছে keys তবে এটি ব্যবহার করে বাইপাস করা যায়map = Object.create(null) । ডিফল্ট কী কী? কীগুলি কীভাবে সম্পর্কিত Object.prototype?
ওভাররেঞ্জচেঞ্জ

4
ক্রোমে আমার পরীক্ষাগুলি দেখিয়েছে যে শৃঙ্খলা বজায় রাখতে মানচিত্রগুলি কোনও উল্লেখযোগ্য পরিমাণের বেশি মেমরি ব্যবহার করবে না। আমি এখানে মিলিয়ন কীগুলির জন্য 0.1 কেবি আরও ছিল এবং আমার মনে হয় না যে এটি শৃঙ্খলা বজায় রাখার জন্য ছিল। তবে, এটি ~ 0.1KB মনে হয় একটি ধ্রুবক ওভারহেড। যদি আপনি পরিবর্তে একটি কী দিয়ে মিলিয়ন মানচিত্র তৈরি করেন এবং এটি বস্তুর চেয়ে অনেক বড় তুলনা করেন।
jgmjgm

2
@ ললসন আপনি সেখানে একটি বস্তু তৈরি করছেন। ইএস spec স্পেকটির জন্য newঅপারেটরটিকে Mapপ্রতীকটি ব্যবহার করা আবশ্যক অর্থাৎ new Mapমানচিত্রের অবজেক্ট তৈরি করার জন্য। var a = {}শর্টহ্যান্ড (অর্থ সমতুল্য)var a = Object.create(Object.prototype)
ডুয়াদওয়াদ

103

মূল পার্থক্যটি হ'ল অবজেক্টগুলি কেবল স্ট্রিং কীগুলি সমর্থন করে যেখানে মানচিত্রগুলি কম-বেশি যে কোনও মূল প্রকারকে সমর্থন করে।

তাহলে আমি কি obj[123] = trueএবং তারপর Object.keys(obj)তারপর আমি পাবেন ["123"]বদলে [123]। একটি মানচিত্র কী এবং প্রকারের ধরণটি সংরক্ষণ করে [123]যা দুর্দান্ত। মানচিত্রগুলি আপনাকে কীগুলি হিসাবে অবজেক্টগুলি ব্যবহার করার অনুমতি দেয়। Ditionতিহ্যগতভাবে এটি করার জন্য আপনাকে বস্তুগুলিকে হ্যাশ করার জন্য এক ধরণের অনন্য শনাক্তকরণ দিতে হবে (আমি মনে করি না যে আমি getObjectIdস্ট্যান্ডার্ডের অংশ হিসাবে জেএস এর মতো কিছু দেখিনি )। মানচিত্রগুলি অর্ডার সংরক্ষণের গ্যারান্টিও রাখে তাই সংরক্ষণের জন্য এটি সর্বোপরি ভাল এবং কখনও কখনও আপনাকে কয়েক প্রকারের করার দরকার সংরক্ষণ করতে পারে।

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

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

({}).toString
    toString() { [native code] }
JSON.parse('{}').toString
    toString() { [native code] }
(Object.create(null)).toString
    undefined
JSON.parse('{}', (k,v) => (typeof v === 'object' && Object.setPrototypeOf(v, null) ,v)).toString
    undefined

বস্তুর উপর দূষণ কেবল এমন কিছু নয় যা কোডকে আরও বিরক্তিকর, ধীর ইত্যাদি করে তোলে তবে সুরক্ষার জন্যও এর সম্ভাব্য পরিণতি হতে পারে।

অবজেক্টগুলি খাঁটি হ্যাশ টেবিল নয় তবে আরও করার চেষ্টা করছে। আপনার মাথাব্যথা আছে hasOwnProperty, দৈর্ঘ্য সহজে ( Object.keys(obj).length) ইত্যাদি অর্জন করতে সক্ষম হচ্ছেন না । অবজেক্টগুলি বিশুদ্ধরূপে হ্যাশ মানচিত্র হিসাবে ব্যবহার করার উদ্দেশ্যে নয় বরং ডায়নামিক এক্সটেনসিবল অবজেক্টস হিসাবেও ব্যবহৃত হয় এবং তাই যখন আপনি এগুলি খাঁটি হ্যাশ টেবিল হিসাবে ব্যবহার করেন তখন সমস্যা দেখা দেয়।

বিভিন্ন সাধারণ ক্রিয়াকলাপের তুলনা / তালিকা:

    Object:
       var o = {};
       var o = Object.create(null);
       o.key = 1;
       o.key += 10;
       for(let k in o) o[k]++;
       var sum = 0;
       for(let v of Object.values(m)) sum += v;
       if('key' in o);
       if(o.hasOwnProperty('key'));
       delete(o.key);
       Object.keys(o).length
    Map:
       var m = new Map();
       m.set('key', 1);
       m.set('key', m.get('key') + 10);
       m.foreach((k, v) => m.set(k, m.get(k) + 1));
       for(let k of m.keys()) m.set(k, m.get(k) + 1);
       var sum = 0;
       for(let v of m.values()) sum += v;
       if(m.has('key'));
       m.delete('key');
       m.size();

বিবিধ উত্থান-পতন (পারফরম্যান্স, টর্স, পোর্টেবল, এক্সটেন্ডেবল, ইত্যাদি) সহ কয়েকটি অন্যান্য বিকল্প, পদ্ধতি, পদ্ধতি ইত্যাদি রয়েছে। অবজেক্টগুলি ভাষাটির মূল বিষয় হওয়ার জন্য কিছুটা অদ্ভুত তাই আপনার সাথে কাজ করার জন্য প্রচুর স্থিতিশীল পদ্ধতি রয়েছে।

মূল ধরণের সংরক্ষণের মানচিত্রের সুবিধা ছাড়াও কীগুলি হিসাবে বস্তুর মতো জিনিসগুলিকে সমর্থন করতে সক্ষম হওয়া যেমন তারা বস্তুর অনেক বেশি পার্শ্ব প্রতিক্রিয়া থেকে বিচ্ছিন্ন হয়। মানচিত্রটি একটি খাঁটি হ্যাশ, একই সাথে কোনও জিনিস হওয়ার চেষ্টা করার বিষয়ে কোনও বিভ্রান্তি নেই। প্রক্সি ফাংশনগুলির সাহায্যে মানচিত্রগুলি সহজেই প্রসারিত করা যায়। অবজেক্টের বর্তমানে একটি প্রক্সি শ্রেণি রয়েছে তবে কর্মক্ষমতা এবং মেমরির ব্যবহার অত্যন্ত গুরুতর, বাস্তবে আপনার নিজস্ব প্রক্সি তৈরি করা হচ্ছে যা অবজেক্টের জন্য মানচিত্রের মতো দেখতে বর্তমানে প্রক্সিটির চেয়ে আরও ভাল পারফর্ম করে।

মানচিত্রের যথেষ্ট অসুবিধা হ'ল এগুলি সরাসরি জেএসএনের সাথে সমর্থন করে না। পার্সিং সম্ভব তবে বেশ কয়েকটি হ্যাঙ্গআপ রয়েছে:

JSON.parse(str, (k,v) => {
    if(typeof v !== 'object') return v;
    let m = new Map();
    for(k in v) m.set(k, v[k]);
    return m;
});

উপরেরগুলি একটি গুরুতর পারফরম্যান্স হিটকে উপস্থাপন করবে এবং কোনও স্ট্রিং কীগুলি সমর্থন করবে না। জেএসএন এনকোডিং আরও জটিল এবং সমস্যাযুক্ত (এটি অনেকগুলি পদ্ধতির মধ্যে একটি):

// An alternative to this it to use a replacer in JSON.stringify.
Map.prototype.toJSON = function() {
    return JSON.stringify({
        keys: Array.from(this.keys()),
        values: Array.from(this.values())
    });
};

আপনি খাঁটি মানচিত্র ব্যবহার করছেন তবে এটি এতটা খারাপ নয় তবে আপনি যখন ধরণের মিশ্রণ করছেন বা স্কেল নন-স্কেলার মানগুলি কী হিসাবে ব্যবহার করছেন তখন সমস্যা হবে (এটি নয় যে জেএসওএন সেই ধরণের ইস্যুতে যেমন নিখুঁত, যেমন আই সার্কুলার অবজেক্ট রেফারেন্স)। আমি এটি পরীক্ষা করি নি তবে সম্ভাবনা হ'ল স্ট্রিংফাইয়ের তুলনায় এটি পারফরম্যান্সকে মারাত্মকভাবে আঘাত করবে।

অন্যান্য স্ক্রিপ্টিং ভাষার প্রায়শই এ জাতীয় সমস্যা থাকে না কারণ তাদের কাছে মানচিত্র, অবজেক্ট এবং অ্যারের জন্য স্পষ্টত অ-স্ক্যালার প্রকার রয়েছে। ওয়েব বিকাশ প্রায়শই অ-স্কেলার প্রকারের সাথে ব্যথা হয় যেখানে আপনাকে পিএইচপি বৈশিষ্ট্যগুলির জন্য এ / এম ব্যবহার করে বস্তুর সাথে অ্যারে / মানচিত্রকে মার্জ করে এবং জেএস ম্যাপ / অবজেক্টকে এম / ও প্রসারিত অ্যারের সাথে মার্জ করে like জটিল ধরণের একত্রিত করা হ'ল উচ্চ স্তরের স্ক্রিপ্টিং ভাষার শয়তানের নিষ্ক্রিয়তা।

এখন পর্যন্ত এগুলি মূলত বাস্তবায়ন সম্পর্কিত বিষয় তবে বুনিয়াদি ক্রিয়াকলাপগুলির জন্য পারফরম্যান্সও গুরুত্বপূর্ণ। পারফরম্যান্সটিও জটিল কারণ এটি ইঞ্জিন এবং ব্যবহারের উপর নির্ভর করে। আমি কোনও ভুলকে অস্বীকার করতে না পারার কারণে লবণের দানার সাথে আমার পরীক্ষাগুলি চালিয়ে যাও (আমাকে এই তাড়াহুড়ো করতে হবে)। খনি হিসাবে পরীক্ষা করার জন্য আপনার নিজের পরীক্ষাগুলি চালানো উচিত কেবলমাত্র কোনও নির্দিষ্ট ইঙ্গিত দেওয়ার জন্য খুব সাদামাটা পরিস্থিতি examine খুব বড় অবজেক্ট / মানচিত্রের জন্য ক্রোমের পরীক্ষাগুলি অনুসারে অবজেক্টগুলির জন্য পারফরম্যান্স আরও খারাপ কারণ মুছে ফেলার জন্য এটি সম্ভবত O (1) এর চেয়ে কী সংখ্যার সাথে সমানুপাতিক:

Object Set Took: 146
Object Update Took: 7
Object Get Took: 4
Object Delete Took: 8239
Map Set Took: 80
Map Update Took: 51
Map Get Took: 40
Map Delete Took: 2

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

এই নির্দিষ্ট মাপদণ্ডের জন্য ফায়ারফক্সে এটি একটি ভিন্ন গল্প:

Object Set Took: 435
Object Update Took: 126
Object Get Took: 50
Object Delete Took: 2
Map Set Took: 63
Map Update Took: 59
Map Get Took: 33
Map Delete Took: 1

আমার তাত্ক্ষণিকভাবে এটি উল্লেখ করা উচিত যে ফায়ারফক্সের অবজেক্টগুলি থেকে মুছে ফেলা এই নির্দিষ্ট মাপদণ্ডে কোনও সমস্যা দেখা দিচ্ছে না, তবে অন্যান্য মানদণ্ডে এটি বিশেষত যখন Chrome এর মতো অনেকগুলি কী রয়েছে তখন সমস্যা তৈরি করেছে। বড় সংগ্রহের জন্য ফায়ারফক্সে মানচিত্রগুলি সুস্পষ্টভাবে উন্নত।

তবে এটি গল্পের শেষ নয়, অনেক ছোট ছোট জিনিস বা মানচিত্রের কী হবে? আমি এটির একটি দ্রুত মানদণ্ড করেছি, তবে সম্পূর্ণরূপে এক নয় (সেটিং / পাওয়া) যা উপরের ক্রিয়াকলাপগুলিতে অল্প সংখ্যক কী দিয়ে সেরা সম্পাদন করে। এই পরীক্ষাটি মেমরি এবং ইনিশিয়ালাইজেশন সম্পর্কে আরও বেশি।

Map Create: 69    // new Map
Object Create: 34 // {}

আবার এই পরিসংখ্যানগুলি পৃথক হলেও মূলত অবজেক্টের একটি ভাল নেতৃত্ব রয়েছে। কিছু ক্ষেত্রে মানচিত্রের উপরে অবজেক্টের সীসা চূড়ান্ত (~ 10 গুণ ভাল) তবে গড়ে এটি প্রায় 2-3 গুণ ভাল ছিল। দেখে মনে হচ্ছে চরম পারফরম্যান্স স্পাইকগুলি উভয় উপায়েই কাজ করতে পারে। আমি কেবল Chrome মেমরির ব্যবহার এবং ওভারহেডের প্রোফাইল পরীক্ষার জন্য এটি ক্রোম এবং তৈরিতে পরীক্ষা করেছি। আমি বেশ অবাক হয়ে দেখেছি যে ক্রোমে এটি প্রদর্শিত হয় যে একটি কী সহ মানচিত্রগুলি একটি কী সহ অবজেক্টগুলির চেয়ে প্রায় 30 গুণ বেশি মেমরি ব্যবহার করে।

উপরের সমস্ত ক্রিয়াকলাপ (4 কী) দিয়ে অনেক ছোট ছোট বস্তুর পরীক্ষার জন্য:

Chrome Object Took: 61
Chrome Map Took: 67
Firefox Object Took: 54
Firefox Map Took: 139

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

অবশ্যই এটিতে পৃথক বিকল্পগুলি অন্তর্ভুক্ত নয় যা বন্যভাবে পরিবর্তিত হতে পারে। আমি এই পরিসংখ্যানগুলির সাথে মাইক্রো-অপ্টিমাইজ করার পরামর্শ দেব না। আপনি যা থেকে বেরিয়ে আসতে পারেন তা হ'ল থাম্বের নিয়ম হিসাবে, খুব বড় মূল মান স্টোর এবং ছোট কী মানের স্টোরগুলির জন্য বস্তুগুলির জন্য মানচিত্রকে আরও দৃ strongly়ভাবে বিবেচনা করুন।

এর বাইরেও এটিকে কার্যকর করার জন্য এবং প্রথমে এটি কাজ করার জন্য এই দুটিয়ের সাথে সেরা কৌশল। প্রোফাইলিংয়ের সময় এটি মনে রাখা জরুরী যে কখনও কখনও আপনি যখন জিনিসগুলি যখন দেখেন তখন ধীরে ধীরে যে বিষয়গুলি মনে করেন না সেগুলি অবজেক্ট কী মোছার ক্ষেত্রে যেমন দেখা যায় তেমন ইঞ্জিন কিরকগুলির কারণে অবিশ্বাস্যরকম ধীর হতে পারে।


ক্রমহীনতার অভাব অনেকগুলি বিকাশকারীদের জন্য সত্যিকারের ব্যথা হয়ে দাঁড়িয়েছে। এর ভোট দিন তাকান আমি LocalStorage একটি ES6 ম্যাপ কিভাবে জিদ না (অথবা অন্যত্র)? এবং আপনি কীভাবে একটি ES6 মানচিত্র JSON.stringify করবেন?
ফ্রাঙ্কলিন ইউ

মিলিসেকেন্ড, বাইট বা মোট বস্তুতে সংখ্যাটি কী?
স্টিফানসআর্যা

এমএস নিয়েছে (কিছু ব্যবহার করা কিছু বলার জন্য ছোট, তাই এটি এক্ষেত্রে সময় ব্যয় করে)। যদিও এটি একটি পুরানো পরীক্ষা এবং আমার কাছে আর বেঞ্চমার্ক কোড নেই। এখন সম্ভবত এটি খুব আলাদা। মুছার সমস্যাটি উদাহরণস্বরূপ আমার বিশ্বাস স্থির is
jgmjgm

27

আমি মনে করি না যে এখন পর্যন্ত উত্তরে নীচের বিষয়গুলি উল্লেখ করা হয়েছে, এবং আমি ভেবেছিলাম সেগুলি উল্লেখযোগ্য হবে।


মানচিত্র বড় হতে পারে

ক্রোমে আমি নিয়মিত অবজেক্টের সাথে 11.1 মিলিয়ন বনাম 16.7 মিলিয়ন কী / মান জোড়া পেতে পারি । প্রায় 50% এর সাথে আরও জোড় যুক্ত । তারা দু'টি ক্রাশ হওয়ার আগে প্রায় 2GB স্মৃতি গ্রহণ করে এবং তাই আমার মনে হয় ক্রোম দ্বারা সীমাবদ্ধ মেমরিটি করা উচিত ( সম্পাদনা : হ্যাঁ, 2 পূরণ করার চেষ্টা করুন এবং এটি ক্র্যাশ হওয়ার আগে আপনি কেবল প্রতিটি 8.3 মিলিয়ন জোড় পেতে পারেন)। আপনি নিজেরাই এই কোড দিয়ে এটি পরীক্ষা করতে পারেন (এগুলিকে আলাদাভাবে চালান এবং একই সাথে নয়, স্পষ্টতই):MapMapMaps

var m = new Map();
var i = 0;
while(1) {
    m.set(((10**30)*Math.random()).toString(36), ((10**30)*Math.random()).toString(36));
    i++;
    if(i%1000 === 0) { console.log(i/1000,"thousand") }
}
// versus:
var m = {};
var i = 0;
while(1) {
    m[((10**30)*Math.random()).toString(36)] = ((10**30)*Math.random()).toString(36);
    i++;
    if(i%1000 === 0) { console.log(i/1000,"thousand") }
}

অবজেক্টগুলির ইতিমধ্যে কিছু বৈশিষ্ট্য / কী রয়েছে

এই আমাকে আগে ছুঁড়েছে। নিয়মিত বস্তু আছে toString, constructor,valueOf , hasOwnProperty, isPrototypeOfএবং অন্যান্য পূর্ব বিদ্যমান বৈশিষ্ট্য একটি গুচ্ছ। এটি বেশিরভাগ ব্যবহারের ক্ষেত্রে বড় সমস্যা নাও হতে পারে তবে এটি আমার জন্য আগে সমস্যার কারণ হয়ে দাঁড়িয়েছে।

মানচিত্রগুলি ধীর হতে পারে:

দরুন .getফাংশন কল ওভারহেড এবং অভ্যন্তরীণ অপ্টিমাইজেশান অভাব, মানচিত্র যথেষ্ট ধীর হতে পারে কিছু কাজের জন্য একটি প্লেইন পুরানো জাভাস্ক্রিপ্ট অবজেক্ট নয়।


1
আপনার মতে, শব্দার্থবিজ্ঞান এখানে কর্মক্ষমতা ছাড়িয়ে যায়? আপনার অভিধানের দরকার হলে মানচিত্রগুলি নিখুঁত মনে হয় তবে ধীর সন্ধানে তা গ্রহণ করা শক্ত। অভিধানের পুরো পয়েন্টটি কি দ্রুত অনুসন্ধান নয়?
ব্যবহারকারী 2954463

3
আমি স্পষ্টভাবে প্লেইন পুরোনো বস্তুর সঙ্গে যেতে চাই যদি আপনি 11 মিলিয়ন কী / মান জোড়া সাথে এসেছেন সূক্ষ্ম এবং মত পূর্ব বিদ্যমান চাবি যত্ন সম্পর্কে না toString, constructorইত্যাদি (অর্থাত আপনার কি তাদের সাথে কোন সংঘর্ষ অত্যন্ত সম্ভাবনা কম)। এগুলির সাথে কাজ করা সহজ - উদাহরণস্বরূপ বৃদ্ধি বৃদ্ধি obj[i] = (obj[i] || 0) + 1, যদিও Mapএটি map.set(i, (map.get(i) || 0) + 1)এখনও খুব খারাপ নয়, তবে এটি কেবল দেখায় যে কীভাবে জিনিসগুলি অযথা অগোছালো হতে পারে। মানচিত্রে অবশ্যই তাদের ব্যবহারের ক্ষেত্রে রয়েছে তবে প্রায়শই একটি সরল বস্তু তা করবে।

মনে রাখবেন আপনি ডিফল্ট পরিত্রাণ পেতে পারেন toString, constructorলেখার মাধ্যমে, (ইত্যাদি) বস্তুর বৈশিষ্ট্যাবলী obj = Object.create(null)পরিবর্তে obj = {}

17

অবজেক্টগুলি অভিধানের মতো আচরণ করতে পারে কারণ জাভাস্ক্রিপ্টটি গতিশীলভাবে টাইপ করা হয়েছে, আপনাকে যে কোনও সময় কোনও বস্তুর বৈশিষ্ট্য যুক্ত বা সরাতে দেয়।

তবে নতুন Map()কার্যকারিতা আরও ভাল কারণ:

  • এটা তোলে প্রদান করে get, set, has, এবংdelete পদ্ধতি।
  • কেবল স্ট্রিংয়ের পরিবর্তে কীগুলির জন্য যে কোনও ধরণের গ্রহণ করে।
  • সহজ জন্য একটি পুনরুক্তি প্রদান করে for-of ব্যবহারের এবং ফলাফলের ক্রম বজায় রাখে।
  • প্রোটোটাইপ এবং অন্যান্য বৈশিষ্ট্যগুলি পুনরাবৃত্তি বা অনুলিপি করার সময় প্রদর্শিত হবে না।
  • এটি লক্ষ লক্ষ আইটেম সমর্থন করে।
  • জাভাস্ক্রিপ্ট ইঞ্জিনগুলি আরও ভাল হওয়ার সাথে সাথে এটি খুব দ্রুত এবং দ্রুততর হতে থাকে।

আপনার কেবলমাত্র 99% সময় ব্যবহার করা উচিত Map() । তবে আপনি যদি কেবল স্ট্রিং-ভিত্তিক কী ব্যবহার করেন এবং সর্বাধিক পঠন পারফরম্যান্সের প্রয়োজন হয় তবে অবজেক্টগুলি আরও ভাল পছন্দ হতে পারে।

বিশদটি হ'ল (প্রায় সমস্ত) জাভাস্ক্রিপ্ট ইঞ্জিনগুলি পটভূমিতে সি ++ ক্লাসে অবজেক্টগুলি সংকলন করে। এই ধরণেরগুলি তাদের "বাহ্যরেখা" দ্বারা ক্যাশেড এবং পুনঃব্যবহার করা হয়, সুতরাং যখন আপনি একই সঠিক বৈশিষ্ট্য সহ কোনও নতুন অবজেক্ট তৈরি করেন ইঞ্জিন একটি বিদ্যমান পটভূমি শ্রেণীর পুনরায় ব্যবহার করবে। এই শ্রেণীর বৈশিষ্ট্যগুলির অ্যাক্সেসের পথটি খুব অনুকূলিত এবং এ এর ​​অনুসন্ধানের চেয়ে অনেক দ্রুতMap()

কোনও সংযোজন যুক্ত করা বা অপসারণের ফলে ক্যাশেড ব্যাকিং ক্লাসটি পুনরায় সংকলিত হয় যার কারণ হিসাবে প্রচুর কী সংযোজন এবং মুছে ফেলা সহ অভিধান হিসাবে একটি অবজেক্টটি ব্যবহার করা খুব ধীর, তবে অবজেক্ট পরিবর্তন না করেই বিদ্যমান কীগুলি পড়তে এবং নিয়োগ দেওয়া খুব দ্রুত হয়।

সুতরাং আপনার যদি স্ট্রিং কীগুলির সাথে একবারে পঠন-ভারী কাজের চাপ পড়ে থাকে তবে objectএকটি বিশেষ উচ্চ-পারফরম্যান্স অভিধান হিসাবে একটি ব্যবহার করুন , তবে সমস্ত কিছুর জন্য একটি ব্যবহার করুন Map()


অবজেক্ট get set has deleteইত্যাদি কার্যকারিতাও সরবরাহ করে, এটি ঠিক তেমন মার্জিত নয় (তবে মন্দও নয়)। Mapপুনরাবৃত্তির জন্য কোন উপায়ে ব্যবহার করা সহজ? নিশ্চিত নই যে আমি রাজি হতে পারি।
অ্যান্ড্রু

@ অ্যান্ড্রু আমি পদ্ধতিগুলি নিয়ে যাচ্ছি, এবং আপনি কী ব্যবহার করছেন এবং ফলাফলের উপর নির্ভর করে কার্যকারিতাও আলাদা। প্রোটোটাইপ এবং নেটিভ বৈশিষ্ট্যগুলি লুপে প্রদর্শিত হয় না এবং একই ক্রম বজায় রাখে এমন একটি সাধারণ জেএস পুনরায় ব্যবহারকারীকে আইট্রেট করা সহজ।
মণি গন্ধম

11

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

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

এটি গুরুত্বপূর্ণ, কারণ সংক্ষিপ্ত কোডটি পড়ার পক্ষে দ্রুত, আরও সরাসরি অভিব্যক্তিপূর্ণ এবং প্রোগ্রামারের মাথায় ভাল রাখা kept

আরেকটি দিক: কারণ সেট () মানচিত্রটি দেয় না, মানটি দেয় না, কাজগুলি নির্ধারণ করা অসম্ভব।

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

ডিবাগিং মানচিত্রগুলি আরও বেদনাদায়ক। নীচে, আপনি মানচিত্রের কীগুলি কী তা দেখতে পাচ্ছেন না। এটি করার জন্য আপনাকে কোড লিখতে হবে।

শুভকামনা একটি মানচিত্র Iterator মূল্যায়ন

কোনও আইডিই দ্বারা বিষয়গুলি মূল্যায়ন করা যেতে পারে:

ওয়েবস্টোরম কোনও বস্তুর মূল্যায়ন করছে


4
এই সমস্ত দেওয়া, মনে হচ্ছে মানচিত্র একটি অকাল অপ্টিমাইজেশন।
PRMan

10

সারসংক্ষেপ:

  • Object: একটি ডেটা কাঠামো যাতে ডেটা কী মান জোড় হিসাবে সংরক্ষণ করা হয়। কোনও বস্তুতে কীটি একটি সংখ্যা, স্ট্রিং বা প্রতীক হতে হবে। মানটি অন্য কোনও বস্তু, ফাংশন ইত্যাদির মতোও হতে পারে A কোনও বস্তু হ'ল একটি নন অর্ডার করা ডেটা স্ট্রাকচার, অর্থাৎ কী মান জোড়ার সন্নিবেশের ক্রমটি মনে রাখা হয় না
  • ES6 Map: একটি ডেটা কাঠামো যাতে ডেটা কী মান জোড় হিসাবে সংরক্ষণ করা হয়। যা একটি মান একটি অনন্য কী মানচিত্র । কী এবং মান উভয়ই যে কোনও ডেটা টাইপ হতে পারে । মানচিত্রটি একটি পুনরাবৃত্ত ডেটা কাঠামো, এর অর্থ হ'ল সন্নিবেশের ক্রমটি স্মরণ করা হয় এবং আমরা উপাদানগুলি যেমন for..ofলুপে অ্যাক্সেস করতে পারি

মূল পার্থক্য:

  • একটি Mapআদেশ করা হয় এবং iterable, যেহেতু একটি বস্তু আদেশ এবং iterable না করা হয় না

  • আমরা কোনও ধরণের ডেটা Mapকী হিসাবে রাখতে পারি, যেখানে বস্তুর কাছে কেবল একটি সংখ্যা, স্ট্রিং বা চিহ্ন হিসাবে কী থাকতে পারে।

  • একটি Mapউত্তরাধিকার সূত্রে Map.prototype। এটি সমস্ত ধরণের ইউটিলিটি ফাংশন এবং বৈশিষ্ট্য সরবরাহ করে যা Mapবস্তুর সাথে কাজ করা অনেক সহজ করে তোলে।

উদাহরণ:

বস্তু:

let obj = {};

// adding properties to a object
obj.prop1 = 1;
obj[2]    =  2;

// getting nr of properties of the object
console.log(Object.keys(obj).length)

// deleting a property
delete obj[2]

console.log(obj)

মানচিত্র:

const myMap = new Map();

const keyString = 'a string',
    keyObj = {},
    keyFunc = function() {};

// 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.size); // 3

// getting the values
console.log(myMap.get(keyString));    // "value associated with 'a string'"
console.log(myMap.get(keyObj));       // "value associated with keyObj"
console.log(myMap.get(keyFunc));      // "value associated with keyFunc"

console.log(myMap.get('a string'));   // "value associated with 'a string'"
                         // because keyString === 'a string'
console.log(myMap.get({}));           // undefined, because keyObj !== {}
console.log(myMap.get(function() {})) // undefined, because keyFunc !== function () {}

উত্স: MDN


4

অতিরিক্তভাবে একটি সংজ্ঞায়িত ক্রমে পুনরাবৃত্তিযোগ্য হওয়া এবং কী হিসাবে স্বতন্ত্র মানগুলি ব্যবহার করার ক্ষমতা (ব্যতীত -0), মানচিত্র নিম্নলিখিত কারণগুলির কারণে কার্যকর হতে পারে:

  • বৈশিষ্টটি মানচিত্রের অপারেশনগুলিকে গড়ে গড়ে সাবলাইনার করে তোলে।

    অবজেক্টের যে কোনও অ-নির্বোধ বাস্তবায়ন হ্যাশ টেবিল বা অনুরূপ ব্যবহার করবে, সুতরাং সম্পত্তি অনুসন্ধানগুলি সম্ভবত গড়ে স্থির থাকবে। তারপরে অবজেক্টগুলি মানচিত্রের চেয়ে আরও দ্রুততর হতে পারে। তবে তা অনুমানের দ্বারা প্রয়োজন হয় না।

  • অবজেক্টগুলির বাজে অপ্রত্যাশিত আচরণ থাকতে পারে।

    উদাহরণস্বরূপ, ধরা যাক আপনি fooনতুনভাবে তৈরি হওয়া কোনও সামগ্রীতে কোনও সম্পত্তি সেট করেন নি obj, তাই আপনি অপরিবর্তিত প্রত্যাশা obj.fooকরছেন। কিন্তু fooবিল্ট-ইন সম্পত্তি থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হতে পারে Object.prototype। অথবা আপনি obj.fooকোনও অ্যাসাইনমেন্ট ব্যবহার করে তৈরি করার চেষ্টা করছেন তবে কিছু সেটার ইনObject.prototype মান পরিবর্তে রান করে নিজের মান সংরক্ষণ করে।

    মানচিত্র এই ধরণের জিনিস প্রতিরোধ করে। ঠিক আছে, যদি না কিছু স্ক্রিপ্ট মিস হয় Map.prototype। এবং Object.create(null)এটিও কাজ করবে, তবে তারপরে আপনি সাধারণ অবজেক্ট ইনিশিয়ালাইজার সিনট্যাক্সটি হারাবেন।


4

কখন সরল জাভাস্ক্রিপ্ট অবজেক্টের পরিবর্তে মানচিত্র ব্যবহার করবেন?

সরল জাভাস্ক্রিপ্ট অবজেক্ট {কী: 'মান' struct কাঠামোগত ডেটা ধারণ করে। তবে সাধারণ জেএস বস্তুর সীমাবদ্ধতা রয়েছে:

  1. কেবলমাত্র স্ট্রিং এবং চিহ্নগুলি অবজেক্টের কী হিসাবে ব্যবহার করা যেতে পারে। যদি আমরা অন্য কোনও জিনিস বলে, সংখ্যাকে কোনও বস্তুর কী হিসাবে ব্যবহার করি তবে সেই কীগুলি অ্যাক্সেস করার সময় আমরা দেখতে পাব যে কীগুলি স্ট্রিংয়ে রূপান্তরিত হবে স্পষ্টভাবে আমাদের প্রকারের ধারাবাহিকতা হারাতে বাধ্য করে। কনস্ট নামগুলি = {1: 'এক', 2: 'দুই'}; Object.keys (নাম); // ['1', '2']

  2. জেএস শনাক্তকারীকে কোনও সামগ্রীর মূল নাম (যেমন টু স্ট্রিং, কনস্ট্রাক্টর ইত্যাদি) লিখে প্রোটোটাইপগুলি থেকে দুর্ভাগ্যক্রমে উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যগুলি ওভাররাইট করার সম্ভাবনা রয়েছে are

  3. অন্য একটি অবজেক্টের কী হিসাবে ব্যবহার করা যাবে না, সুতরাং কোনও বস্তুর জন্য অন্য কোনও অবজেক্টের কী হিসাবে লেখার মাধ্যমে কোনও অতিরিক্ত তথ্য রচনা করা যাবে না এবং অন্য একটি বস্তুর মান অতিরিক্ত তথ্য ধারণ করবে

  4. বস্তুগুলি পুনরাবৃত্তকারী নয়

  5. কোনও বস্তুর আকার সরাসরি নির্ধারণ করা যায় না

অবজেক্টের এই সীমাবদ্ধতা মানচিত্র দ্বারা সমাধান করা হয়েছে তবে আমাদের মানচিত্রকে প্রতিস্থাপনের পরিবর্তে অবজেক্টের পরিপূরক হিসাবে বিবেচনা করতে হবে। মূলত মানচিত্রটি অ্যারেগুলির কেবল অ্যারে তবে আমাদের অবশ্যই সেই অ্যারেগুলির অ্যারেটি নতুন কীওয়ার্ড সহ যুক্তি হিসাবে মানচিত্রের কাছে পৌঁছে দিতে হবে অন্যথায় কেবল অ্যারের অ্যারের জন্যই মানচিত্রের দরকারী বৈশিষ্ট্য এবং পদ্ধতি উপলব্ধ নেই। এবং মনে রাখবেন অ্যারের অ্যারের ভিতরে কী-মান জোড়গুলি বা মানচিত্রটি কেবল কমা দ্বারা পৃথক করা উচিত, সরল বস্তুগুলির মতো কোনও কলোন নেই।

মানচিত্র বা কোনও অবজেক্ট ব্যবহার করবেন কিনা তা স্থির করার জন্য 3 টিপস:

  1. রান সময় পর্যন্ত কীগুলি অজানা থাকা অবস্থায় অবজেক্টগুলির উপরে মানচিত্র ব্যবহার করুন কারণ ব্যবহারকারী ইনপুট দ্বারা তৈরি বা অজান্তেই কীগুলি সেই আইটেমটি ব্যবহার করে এমন কোডটি ভেঙে ফেলতে পারে যদি সেই কীগুলি বস্তুর উত্তরাধিকারী বৈশিষ্ট্যগুলিকে ওভাররাইট করে, সুতরাং সেই ক্ষেত্রে মানচিত্রটি আরও নিরাপদ। সমস্ত কী একই ধরণের এবং সমস্ত মানচিত্র একই ধরণের হলে মানচিত্রগুলিও ব্যবহার করুন।

  2. কী হিসাবে আদিম মান সংরক্ষণের প্রয়োজন হলে মানচিত্র ব্যবহার করুন।

  3. আমাদের স্বতন্ত্র উপাদানগুলিতে অপারেট করার প্রয়োজন হলে অবজেক্টগুলি ব্যবহার করুন।

মানচিত্র ব্যবহারের সুবিধাগুলি হ'ল:

১. মানচিত্র যেকোন কী প্রকার গ্রহণ করে এবং কী প্রকারটি সংরক্ষণ করে:

আমরা জানি যে যদি অবজেক্টের কীটি স্ট্রিং বা প্রতীক না হয় তবে জেএস সুস্পষ্টভাবে এটিকে একটি স্ট্রিংয়ে রূপান্তরিত করে। বিপরীতে, মানচিত্র যে কোনও ধরণের কীগুলি গ্রহণ করে: স্ট্রিং, সংখ্যা, বুলিয়ান, প্রতীক ইত্যাদি এবং মানচিত্র মূল কী ধরণের সংরক্ষণ করে। এখানে আমরা মানচিত্রের অভ্যন্তরে কী হিসাবে নম্বরটি ব্যবহার করব এবং এটি একটি নম্বর থাকবে:

const numbersMap= new Map();

numbersMap.set(1, 'one');

numbersMap.set(2, 'two');

const keysOfMap= [...numbersMap.keys()];

console.log(keysOfMap);                        // [1, 2]

মানচিত্রের অভ্যন্তরে আমরা এমনকি একটি সম্পূর্ণ অবজেক্টটিকে কী হিসাবে ব্যবহার করতে পারি। এমন অনেক সময় থাকতে পারে যখন আমরা কোনও অবজেক্ট সম্পর্কিত ডেটা সংরক্ষণ করতে চাই, অবজেক্টের ভিতরে এই ডেটা সংযুক্ত না করে যাতে আমরা হতাশ বস্তুগুলির সাথে কাজ করতে পারি তবে অবজেক্ট সম্পর্কে কিছু তথ্য সঞ্চয় করতে চাই। এই ক্ষেত্রে আমাদের মানচিত্রটি ব্যবহার করতে হবে যাতে আমরা বস্তুকে কী হিসাবে এবং সামগ্রীর সম্পর্কিত ডেটাটিকে মান হিসাবে তৈরি করতে পারি।

const foo= {name: foo};

const bar= {name: bar};

const kindOfMap= [[foo, 'Foo related data'], [bar, 'Bar related data']];

তবে এই পদ্ধতির ক্ষতিটি হ'ল কী দ্বারা মানটি অ্যাক্সেস করার জটিলতা, কারণ আমাদের পছন্দসই মান পেতে পুরো অ্যারেটি লুপ করতে হয়।

function getBy Key(kindOfMap, key) {
    for (const [k, v]  of kindOfMap) {
        if(key === k) {
            return v;
        }
    }
    return undefined;
}

getByKey(kindOfMap, foo);            // 'Foo related data'

সঠিক মানচিত্র ব্যবহার করে আমরা মানটিতে সরাসরি অ্যাক্সেস না পাওয়ার এই সমস্যাটি সমাধান করতে পারি।

const foo= {name: 'foo'};

const bar= {name: 'bar'};

const myMap= new Map();

myMap.set(foo, 'Foo related data');
myMap.set(bar, 'Bar related data');

console.log(myMap.get(foo));            // 'Foo related data'

আমরা WeakMap ব্যবহার করে এটি করতে পারতাম, কেবল মাইম্যাপ = নতুন WeakMap () লিখতে হত। মানচিত্র এবং উইকম্যাপের মধ্যে পার্থক্যগুলি হ'ল উইকম্যাপ কীগুলির আবর্জনা সংগ্রহের অনুমতি দেয় (এখানে বস্তুগুলি) যাতে এটি মেমরি ফাঁস রোধ করে, উইকম্যাপ কেবলমাত্র বস্তুকে কী হিসাবে গ্রহণ করে এবং উইকম্যাপের পদ্ধতিগুলির সেট হ্রাস করেছে has

২. মানচিত্রের মূল নামগুলির উপর কোনও বাধা নেই:

সাধারণ জেএস বস্তুর জন্য আমরা দুর্ঘটনাক্রমে প্রোটোটাইপ থেকে উত্তরাধিকারসূত্রে প্রাপ্ত সম্পত্তিটি ওভাররাইট করতে পারি এবং এটি বিপজ্জনক হতে পারে। এখানে আমরা অভিনেতা অবজেক্টের টস্ট্রিং () সম্পত্তিটি ওভাররাইট করব:

const actor= {
    name: 'Harrison Ford',
    toString: 'Actor: Harrison Ford'
};

সরবরাহ করা যুক্তি কোন সরল বস্তু কিনা তা নির্ধারণ করার জন্য এখন একটি fn isPlainObject () সংজ্ঞায়িত করা যাক এবং এই fn এটি পরীক্ষা করার জন্য toString () পদ্ধতি ব্যবহার করে:

function isPlainObject(value) {
    return value.toString() === '[object Object]';
}

isPlainObject(actor);        // TypeError : value.toString is not a function

// this is because inside actor object toString property is a string instead of inherited method from prototype

মানচিত্রে মূল নামগুলির উপর কোনও বিধিনিষেধ নেই, আমরা টপস্ট্রিং, কনস্ট্রাক্টর ইত্যাদির মতো কীগুলি ব্যবহার করতে পারি।

const actorMap= new Map();

actorMap.set('name', 'Harrison Ford');

actorMap.set('toString', 'Actor: Harrison Ford');

function isMap(value) {
  return value.toString() === '[object Map]';
}

console.log(isMap(actorMap));     // true

যদি আমাদের এমন পরিস্থিতি হয় যেখানে ব্যবহারকারী ইনপুট কীগুলি তৈরি করে তবে অবশ্যই আমাদের অবশ্যই এই কীগুলি একটি সরল বস্তুর পরিবর্তে মানচিত্রের ভিতরে নিয়ে যেতে হবে। এটি কারণ, ব্যবহারকারীরা কাস্টম ফিল্ডের নাম পছন্দ করতে পারে, যেমন, স্ট্রিং, কনস্ট্রাক্টর ইত্যাদি then সুতরাং সঠিক সমাধানটি হ'ল একটি মানচিত্রে ইউজার ইন্টারফেসের স্থিতিকে আবদ্ধ করা, মানচিত্রটি ভাঙ্গার কোনও উপায় নেই:

const userCustomFieldsMap= new Map([['color', 'blue'], ['size', 'medium'], ['toString', 'A blue box']]);

৩. মানচিত্রটি পুনরাবৃত্তিযোগ্য:

একটি সরল বস্তুর বৈশিষ্ট্য পুনরাবৃত্তি করতে আমাদের অবজেক্ট.এন্ট্রি () বা অবজেক্ট.কিজ () দরকার। অবজেক্ট.এন্টরিজ (প্লেইনওজেক্ট) অবজেক্ট থেকে নিষ্ক্রিয় কী মান জোড়ার একটি অ্যারে প্রদান করে, তারপরে আমরা সেই কীগুলি এবং মানগুলি গঠন করতে পারি এবং সাধারণ কী এবং মানগুলির আউটপুট পেতে পারি।

const colorHex= {
  'white': '#FFFFFF',
  'black': '#000000'
}

for(const [color, hex] of Object.entries(colorHex)) {
  console.log(color, hex);
}
//
'white' '#FFFFFF'   
'black' '#000000'

মানচিত্রগুলি পুনরাবৃত্তিযোগ্য তাই এজন্য আমাদের মানচিত্রের পুনরাবৃত্তি এবং কী তৈরির জন্য প্রবেশের () পদ্ধতির প্রয়োজন নেই, মানচিত্রে মানচিত্রের ভিতরে সরাসরি মানচিত্রের সাহায্যে কাজ করা যেতে পারে প্রতিটি উপাদান কমা দ্বারা পৃথক পৃথক মূল মান জোড়ার অ্যারে হিসাবে বাস করে ।

const colorHexMap= new Map();
colorHexMap.set('white', '#FFFFFF');
colorHexMap.set('black', '#000000');


for(const [color, hex] of colorHexMap) {
  console.log(color, hex);
}
//'white' '#FFFFFF'   'black' '#000000'

এছাড়াও map.keys () কী এবং মানচিত্রের উপরে একটি পুনরাবৃত্তিকে ফেরত দেয় map

৪. আমরা সহজেই একটি মানচিত্রের আকার জানতে পারি

আমরা সরাসরি কোনও সরল বস্তুতে সম্পত্তিগুলির সংখ্যা নির্ধারণ করতে পারি না। আমাদের একটি সহায়িকা দরকার যেমন, অবজেক্ট.কিজ () যা বস্তুর কীগুলির সাথে একটি অ্যারের প্রদান করে তারপরে দৈর্ঘ্যের সম্পত্তি ব্যবহার করে আমরা কীগুলির সংখ্যা বা প্লেইন অবজেক্টের আকার পেতে পারি।

const exams= {'John Rambo': '80%', 'James Bond': '60%'};

const sizeOfObj= Object.keys(exams).length;

console.log(sizeOfObj);       // 2

তবে মানচিত্রের ক্ষেত্রে আমরা ম্যাপের আকারের আকারে সরাসরি অ্যাক্সেস করতে পারি।

const examsMap= new Map([['John Rambo', '80%'], ['James Bond', '60%']]);

console.log(examsMap.size);

1

এই দুটি টিপস আপনাকে মানচিত্র বা কোনও অবজেক্ট ব্যবহার করবেন কিনা তা সিদ্ধান্ত নিতে সহায়তা করতে পারে:

  • রান সময় পর্যন্ত কীগুলি অজানা থাকে এবং যখন সমস্ত কী একই ধরণের হয় এবং সমস্ত মান একই ধরণের হয় তখন অবজেক্টগুলির উপরে মানচিত্র ব্যবহার করুন।

  • কী হিসাবে আদিম মানগুলি সংরক্ষণ করার প্রয়োজনের ক্ষেত্রে মানচিত্রগুলি ব্যবহার করুন কারণ বস্তু প্রতিটি কীকে একটি স্ট্রিং হিসাবে একটি সংখ্যা মান, বুলিয়ান মান বা অন্য কোনও আদিম মান হিসাবে বিবেচনা করে।

  • যখন যুক্তি থাকে যা পৃথক উপাদানগুলিতে চালিত হয় তখন অবজেক্টগুলি ব্যবহার করুন।

সূত্র: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Keyed_ Collections# Object_and_Map_compare


2
এই টিপসগুলি বিশেষত সহায়ক বলে মনে হয় না কারণ এই মানদণ্ডগুলির দ্বারা জিনিসগুলি ভাগ করে নেওয়া সহজ না হয়। কীগুলি / মান একই ধরণের হলে মানচিত্রগুলি কেন একটি সুবিধা তা আমি প্রথমটির সাথে পাই না। এটি ক্লাস / স্ট্রাক্ট, সংগ্রহের মতো মানচিত্রের মতো অবজেক্ট ব্যবহার করার চেষ্টা করার মতো বলে মনে হচ্ছে। দ্বিতীয়টি খারাপভাবে লেখা হয়েছে বিন্দুটি না পেয়ে। আপনার যখন মেশানো স্ট্রিং সমতুল্য ধরণের ("1" এবং 1) থাকে বা যখন আপনার প্রয়োজন হয় / কী প্রকারগুলি সংরক্ষণ করতে চান তখন সত্যিকার অর্থে এটি মানচিত্রগুলি ব্যবহার করে। সর্বশেষে আমি এটি প্রথম হিসাবে একই মনে করি, এটি ধরেই নেওয়া হচ্ছে যে কোনও জিনিস কী তা তাই আপনি অস্পষ্ট তা জানেন না।
jgmjgm

0

এটি আমার মনে রাখার জন্য এটি একটি ছোট্ট উপায়: KOI

  1. কি। অবজেক্ট কী স্ট্রিং বা প্রতীক symb মানচিত্র কীগুলি সংখ্যা (1 এবং "1" পৃথক), বস্তু NaN, ইত্যাদিও হতে পারে এটি ===একটি ব্যতিক্রম সহ কীগুলির মধ্যে পার্থক্য NaN !== NaNকরতে ব্যবহার করে তবে আপনি NaNকী হিসাবে ব্যবহার করতে পারেন ।
  2. অর্ডার। সন্নিবেশ আদেশটি মনে আছে। সুতরাং [...map]বা [...map.keys()]একটি নির্দিষ্ট আদেশ আছে।
  3. ইন্টারফেস. অবজেক্ট: obj[key]বা obj.a(কিছু ভাষায়, []এবং []=সত্যই ইন্টারফেসের অংশ)। ম্যাপ হয়েছে get(), set(), has(), delete()ইত্যাদি লক্ষ্য করুন আপনি ব্যবহার করতে পারেন map[123]কিন্তু একটি প্লেইন জাতীয় অবজেক্ট হিসেবে এটি ব্যবহার করছে।

0

মজিলা মতে

জাভাস্ক্রিপ্টে মান বনাম মানচিত্রউদাহরণ সহ সংক্ষিপ্তভাবে ।

অবজেক্ট- মানচিত্রের মতো একই ধারণাটি অনুসরণ করে অর্থ উপাত্ত সংরক্ষণের জন্য কী-মান জোড় ব্যবহার করে। তবে কিছুটা পার্থক্য রয়েছে যা কিছু পরিস্থিতিতে মানচিত্রকে আরও ভাল অভিনয় করে তোলে makes

মানচিত্র- একটি ডেটা কাঠামো যা জোড়া আকারে ডেটা সংরক্ষণ করতে সহায়তা করে। এই জুটিতে একটি অনন্য কী এবং একটি মানটি কীতে ম্যাপ করা হয়। এটি সদৃশ প্রতিরোধে সহায়তা করে।

মূল পার্থক্য

  • মানচিত্রটি কোনও জিনিসের উদাহরণ, তবে তদ্বিপরীতটি সত্য নয়।

var map = new Map();
var obj = new Object(); 
console.log(obj instanceof Map);   // false
console.log(map instanceof Object);  // true

  • অবজেক্টে, কী-ক্ষেত্রের ডেটা-টাইপ পূর্ণসংখ্যা, স্ট্রিং এবং চিহ্নগুলিতে সীমাবদ্ধ। মানচিত্রে, কী-ক্ষেত্রটি যে কোনও ডেটা-টাইপের (পূর্ণসংখ্যা, একটি অ্যারে, একটি বস্তু) হতে পারে

var map = new Map();//Empty 
map.set(1,'1');
map.set('one', 1);
map.set('{}', {name:'Hello world'});
map.set(12.3, 12.3)
map.set([12],[12345])

for(let [key,value] of map.entries())
  console.log(key+'---'+value)

  • মানচিত্রে, উপাদানগুলির মূল ক্রম সংরক্ষণ করা হয়েছে। বস্তুর ক্ষেত্রে এটি সত্য নয়।

let obj ={
  1:'1',
  'one':1,
  '{}': {name:'Hello world'},
  12.3:12.3,
  [12]:[100]
}
console.log(obj)

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