ES6 এ মানচিত্র বনাম অবজেক্টস, কখন ব্যবহার করবেন?


83

রেফ: এমডিএন মানচিত্র

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

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

প্রশ্ন:

বস্তুগুলির উপর মানচিত্র ব্যবহারের একটি কার্যকর উদাহরণ কী? বিশেষত, "রানটাইম অবধি কীগুলি অজানা থাকবে?"

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
আপনি এটি ব্যবহার করতে পারেন যেখানে আপনি কোনও ডোম উপাদান বলেছেন যা আপনি কোনও অবজেক্ট ব্যবহার করে কিছু ডেটা সংযুক্ত করতে চান। ব্যবহারের পরিবর্তে কোনও উপাদানের চাবি হিসাবে উপাদানটির আইডি বলুন, আপনি উপাদানটিকে মানচিত্রে একটি কী হিসাবে ব্যবহার করতে পারেন যাতে উপাদানটির কোনও আইডি আছে (বা কোনও অবজেক্টের রেফারেন্স ব্যতীত অন্য কোনও অনন্য শনাক্তকারী) আপনার যত্ন নেই don't ) অথবা না.
রবজি

4
@ রবকে সামান্য সংযোজন করুন: সেক্ষেত্রে এটি সম্ভবত সহায়কও WeakMapহতে পারে।
zerkms

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

4
আমি যখন এমডিএন পৃষ্ঠাটি পড়ছিলাম, তখন আপনি যে অনুচ্ছেদের উদ্ধৃতি দিয়েছিলেন তার তুলনায় ব্যবহারের ক্ষেত্রে বুলেট-পয়েন্টের তালিকা অনেক বেশি সহায়ক ছিল। অবশ্যই আপনার শিরোনামে উত্থাপিত প্রশ্ন সম্পর্কিত।
কোডিংইন্ট্রিগ

উত্তর:


51

বস্তুগুলির উপর মানচিত্র ব্যবহারের একটি কার্যকর উদাহরণ কী?

আমি মনে করি আপনি ইতিমধ্যে একটি ভাল উদাহরণ দিয়েছেন: আপনি Mapকী হিসাবে অবজেক্টগুলি (ফাংশন অবজেক্ট সহ) ব্যবহার করার সময় কমপক্ষে আপনাকে ব্যবহার করতে হবে ।

বিশেষত, "রানটাইম অবধি কীগুলি অজানা থাকবে?"

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

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


4
অথবা অন্য দৃষ্টিকোণ থেকে: যখনই আপনার প্রয়োজন হয় for..ofপ্রোগ্রাম স্তর (উদাহরণস্বরূপ for..in) এর পরিবর্তে ডেটা স্তরে (যেমন ) আপনার অবজেক্টের বৈশিষ্ট্যগুলি নিয়ে পুনরাবৃত্তি করার জন্য a ব্যবহার করুন Mapএই প্রতিক্রিয়া এই শর্তাবলী সম্পর্কে আরও তথ্য ।

আমি মন্তব্য হিসাবে এও যুক্ত করব যে কোনও সময় আপনার কী কী ধরণের হবে তা আপনি জানেন না এবং আপনি কী ডেটা টাইপ হিসাবে স্ট্রিংয়ের প্রত্যাশা করবেন না, তারপরে মানচিত্রের
স্ট্যাকওভারফ্লো / সেকশনগুলি / 32600157/…

26

আমি মনে করি যে ES2015 এর Mapকেবল দুটি কারণই সরল বস্তুগুলি ব্যবহার করার জন্য বাকি রয়েছে:

  • আপনি কোনও বস্তুর ধরণের বৈশিষ্ট্যগুলিতে মোটেও পুনরাবৃত্তি করতে চান না
  • অথবা আপনি করেন তবে সম্পত্তি অর্ডারটি কোনও বিষয় নয় এবং পুনরাবৃত্তির সময় আপনি প্রোগ্রামটিকে ডেটা স্তর থেকে আলাদা করতে পারেন

সম্পত্তি অর্ডার কখন গুরুত্বহীন?

  • যদি আপনার কেবলমাত্র একক মান এবং কিছু ফাংশন থাকে যা এর সাথে সুস্পষ্টভাবে যুক্ত করা উচিত (যেমন Promise- যা ভবিষ্যতের মানের জন্য প্রক্সি - এবং then/ catch)
  • যদি আপনার "স্ট্রাইক / রেকর্ডের মতো ডেটা কাঠামো থাকে তবে" সংকলন সময় "হিসাবে পরিচিত সংস্থাগুলির একটি স্ট্যাটিক সেট থাকে (সাধারণত স্ট্রাইক / রেকর্ডগুলি পুনরাবৃত্ত হয় না)

অন্যান্য সমস্ত ক্ষেত্রে আপনি ব্যবহারের বিষয়টি বিবেচনা করতে পারেন Map, কারণ এটি সম্পত্তি ক্রম সংরক্ষণ করে এবং প্রোগ্রামটি ( Mapবস্তুটিতে নির্ধারিত সমস্ত সম্পত্তি ) ডেটা স্তর থেকে পৃথক করে ( Mapনিজেই সমস্ত প্রবেশিকা )।

এর ঘাটতিগুলো কী কী Map?

  • আপনি সংক্ষিপ্ত বস্তু আক্ষরিক সিনট্যাক্স হারান
  • আপনার JSON.stringyfy এর জন্য কাস্টম প্রতিস্থাপনের প্রয়োজন
  • আপনি ডেস্ট্রাকচারিং হারাবেন যা স্থিতিশীল ডেটা স্ট্রাকচারের সাথে আরও কার্যকর

এই লাইনটি আমাকে খুব উদ্বেগ দেয়: "এটি সম্ভবত খাঁটি, হ্যাশম্যাপের মতো বস্তুর চেয়ে ধীর" আমি পারফরম্যান্সের উন্নতির কারণে আমার সমস্ত বস্তুর মানচিত্রের সাথে প্রতিস্থাপনের কথা ভেবেছিলাম। তবে আপনি বলছেন এটি ধীরে ধীরে ...
মেসকিবি

4
তুমি ঠিক বলছো. Mapসম্ভবত এটি দ্রুততর, কারণ এটি খাঁটিভাবে একটি হ্যাশের উপর ভিত্তি করে তৈরি করা হয়েছে, যেখানে Objectকিছুটা জটিল। ধন্যবাদ!

11

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

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

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


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

যে সংগ্রহগুলিতে সাধারণত কঠোরভাবে টাইপ করা হয় তা যুক্তিযুক্তভাবে পৃথকভাবে বলা যায় যে কঠোরভাবে টাইপ করা কোনও জিনিসই সংগ্রহ হতে হবে।

4
হ্যাঁ, আমি মনে করি এটি কিছুটা বিশ্রী রেখেছিল, তবে ধারণাটি ঠিক আছে। আমার ধারণা যে তারা "কীগুলি রান সময় পর্যন্ত অজানা" ভেবেছিল ইতিমধ্যে একটি সংগ্রহ তৈরি করে। আরও ভাল ফ্রেসিংয়ের জন্য কোনও ধারণা?
বার্গি

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

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

3

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

  • একটি Objectএর কীগুলি Stringগুলি এবং Symbolসেগুলি হয়, যেখানে এগুলি Mapফাংশন, অবজেক্ট এবং যে কোনও আদিম সহ একটির জন্য কোনও মান হতে পারে ।
  • কীগুলিকে Mapঅর্ডার করা হয় যখন অবজেক্টে যুক্ত কীগুলি হয় না। সুতরাং, এটির উপরে পুনরাবৃত্তি করার সময়, কোনও Mapবস্তু সন্নিবেশের ক্রমে কীগুলি প্রদান করে।
  • আপনি সম্পত্তিটির Mapসাহায্যে সহজেই আকার পেতে পারেন size, যখন সম্পত্তিগুলির সংখ্যাটি Objectম্যানুয়ালি নির্ধারণ করতে হবে।
  • Mapএকটি পুনরাবৃত্তিযোগ্য এবং এটি সরাসরি পুনরাবৃত্তি হতে পারে, যখন কোনওটির উপর পুনরাবৃত্তি করার Objectজন্য কিছু ফ্যাশনে এর চাবিগুলি পাওয়া এবং সেগুলির উপর পুনরাবৃত্তি প্রয়োজন।
  • একটিতে Objectএকটি প্রোটোটাইপ রয়েছে, তাই মানচিত্রে এমন ডিফল্ট কী রয়েছে যা আপনি যদি যত্নশীল না হন তবে আপনার কীগুলির সাথে সংঘর্ষে পড়তে পারে। ES5 হিসাবে এটি ব্যবহার করে বাইপাস করা যেতে পারে map = Object.create(null), তবে এটি খুব কমই করা হয়।
  • Mapঘন ঘন সংযোজন এবং কী জোড়া মুছে ফেলার জড়িত পরিস্থিতিতে A আরও ভাল পারফর্ম করতে পারে।

এমডিএন


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 মূল্যায়ন

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

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


7
এটি " বস্তুগুলির উপরে মানচিত্র ব্যবহারের ক্ষেত্রে প্রয়োগযোগ্য উদাহরণ কী? "
বার্গি

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