জাভাস্ক্রিপ্টে এনাম সংজ্ঞায়নের জন্য পছন্দসই বাক্য গঠন কী?


2081

জাভাস্ক্রিপ্টে এনাম সংজ্ঞায়নের জন্য পছন্দসই বাক্য গঠন কী? কিছুটা এইরকম:

my.namespace.ColorEnum = {
    RED : 0,
    GREEN : 1,
    BLUE : 2
}

// later on

if(currentColor == my.namespace.ColorEnum.RED) {
   // whatever
}

নাকি এর চেয়েও বেশি পছন্দসই প্রতিমা আছে?


131
0একটি গণনা নম্বর হিসাবে ব্যবহার করবেন না । যদি না এটি এমন কোনও কিছুর জন্য ব্যবহার করা থাকে যা সেট করা হয়নি। জেএস false || undefined || null || 0 || "" || '' || NaNব্যবহার করার তুলনায় সমস্তকে একই মান হিসাবে বিবেচনা করে ==
matsko

152
@ formatko এটি কি কেবল == ব্যবহারের বিরুদ্ধে যুক্তি নয়?
sdm350

6
0 == nullমিথ্যা ফিরিয়ে দেয়
এমকন্ট

11
কিন্তু false == 0+null == 0(এবং নম্বরে ধর্মান্তর কখনও কখনও যখন আপনি এটি আশা করবেন না ঘটতে) সময়, null == undefinedখুব, এবং +undefinedহয় NaN(যদিও NaN != NaN)।
sanderd17

46
ডবল সমতা ম্যাট্রিক্স চেয়ে Microsoft Word এর স্বয়ংক্রিয় বিন্যাস আরো বিভ্রান্তিকর
aaaaaa

উত্তর:


894

1.8.5 যেহেতু বস্তুটি সিল এবং হিমায়িত করা সম্ভব, সুতরাং উপরের হিসাবে এটি সংজ্ঞায়িত করুন:

const DaysEnum = Object.freeze({"monday":1, "tuesday":2, "wednesday":3, ...})

অথবা

const DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...}
Object.freeze(DaysEnum)

ও ভয়েলা! জেএস enums।

তবে এটি আপনাকে কোনও চলককে অনাকাঙ্ক্ষিত মান নির্ধারণ করা থেকে বিরত রাখে না, যা প্রায়শই এনামগুলির মূল লক্ষ্য:

let day = DaysEnum.tuesday
day = 298832342 // goes through without any errors

প্রকারের সুরক্ষা (এনাম সহ বা অন্যথায়) এর শক্তিশালী ডিগ্রি নিশ্চিত করার একটি উপায় হ'ল টাইপস্ক্রিপ্ট বা প্রবাহের মতো একটি সরঞ্জাম ব্যবহার করা ।

সূত্র

উদ্ধৃতিগুলির প্রয়োজন নেই তবে আমি এগুলি ধারাবাহিকতার জন্য রেখেছি।


6
উইকিপিডিয়া ( en.wikedia.org/wiki/JavaScript# সংস্করণ ) অনুসারে এটি ফায়ারফক্স 4, আইই 9, অপেরা 11.60 এর ক্ষেত্রে প্রযোজ্য এবং আমি জানি এটি ক্রোমে কাজ করে।
আর্তুর সিজ্জাকা

76
এই সঠিক উত্তর এখন 2012 আরো সহজ: var DaysEnum = Object.freeze ({ monday: {}, tuesday: {}, ... });। আপনার কোনও আইডি নির্দিষ্ট করার দরকার নেই, এনামগুলি তুলনা করার জন্য আপনি কেবল একটি খালি বস্তু ব্যবহার করতে পারেন। if (incommingEnum === DaysEnum.monday) //incommingEnum is monday
গ্যাব্রিয়েল লালামাস

34
পিছিয়ে সামঞ্জস্যের জন্য,if (Object.freeze) { Object.freeze(DaysEnum); }
স্যালস করুন

16
আমি উল্লেখ করতে চাই ({ monday: {}, যে করণ ইত্যাদির অর্থ হ'ল আপনি যদি সেই জিনিসটিকে স্ট্রিংফাইয়ের মাধ্যমে JSON এ রূপান্তর করেন তবে আপনি [{"day": {}}]যা পাবেন তা কার্যকর নয়।
jcollum

9
@ সুপুহস্তর এই প্রশ্ন সম্পর্কে আমার মতামত এখন অন্যরকম। হিম () ব্যবহার করবেন না, এটি সম্পূর্ণ অকেজো এবং "বোকা" জিনিসগুলি করার সময় নষ্ট করা waste আপনি একটি enum এক্সপোজ করতে চান তাহলে, কেবল এই এক্সপোজ: var DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...}। আমার আগের মন্তবীর মতো বস্তুর তুলনা করা সংখ্যার তুলনায় অনেক বেশি স্লোর।
গ্যাব্রিয়েল লামাস

608

এটি খুব একটা উত্তর নয়, তবে আমি বলব যে এটি ব্যক্তিগতভাবে ব্যক্তিগতভাবে ঠিক কাজ করে

এটি বলার পরে, যেহেতু মানগুলি কী তা বিবেচ্য নয় (আপনি 0, 1, 2 ব্যবহার করেছেন), আপনি যদি বর্তমান মানটি আউটপুট করতে চান তবে আমি একটি অর্থবহ স্ট্রিং ব্যবহার করব।


377
এটি অন্য উত্তরে বলা হয়েছিল, তবে যেহেতু এই উত্তরটি স্বীকৃত উত্তর, আমি এটি এখানে পোস্ট করব। ওপির সমাধানটি সঠিক। এটি আরও ভাল হবে, যদিও এটি ব্যবহার করা হয় Object.freeze()। এটি এনামের মানগুলি পরিবর্তন করতে অন্যান্য কোডকে আটকাবে। উদাহরণ:var ColorEnum = Object.freeze({RED: 0, GREEN: 1, BLUE: 2});
সিলডোরথ

5
@ টোলগা এই লাইব্রেরির জন্য আপনাকে ধন্যবাদ! এটি আমাকে কেবল ন্যূনতম পর্যন্ত সিদ্ধ করতে অনুপ্রাণিত করেছিল, তবে কয়েকটি বৈশিষ্ট্যও যুক্ত করেছে! আমি আপনাদের কাঁটাচামচ করেছি এবং সব এখানে রেখেছি
সুপুস্তর

3
@ সুপুহস্টার এই দুর্দান্ত! আপনি এটি ব্যবহার করতে পেরে আমি আনন্দিত .. আপনি যদি এই লাইব্রেরিতে এটি একীভূত করতে চান তবে একটি পুল অনুরোধ করতে দ্বিধা বোধ করুন, তবে আমি এনএমপি গ্রন্থাগারটি আপডেট করতে পারি
টোলগা ই

2
যদি কেউ আগ্রহী হন তবে আমি টাইপ-সেফ এনামগুলি জাভাতে দেখতে তাদের অনুরূপ প্রয়োগ করেছি । এর অর্থ আপনি instanceofচেক করতে পারেন । যেমন ColorEnum.RED instanceof ColorEnum(রিটার্ন true) আপনি নাম ColorEnum.fromName("RED") === ColorEnum.RED(রিটার্ন true) এর বাইরেও একটি উদাহরণ সমাধান করতে পারেন । প্রতিটি দৃষ্টান্তে একটি .name()এবং একটি .ordinal()পদ্ধতিও রয়েছে এবং values()এনামের নিজেই একটি পদ্ধতি থাকে যা সমস্ত ধ্রুবকের অ্যারেকে ফিরিয়ে দেয়।
ভিভিন পালিথ

3
আমি নিশ্চিত নই যে আমি "অর্থপূর্ণ স্ট্রিং" পরামর্শের সাথে একমত। এনামগুলিকে স্ট্রিং বা সংখ্যা হিসাবে ভাবা উচিত নয়; এগুলি বিমূর্ত ডেটা ধরণের। কিছু সহায়ক পদ্ধতি ছাড়াই "বর্তমান মান আউটপুট" করা সম্ভব হবে না। জাভা এবং .NET এ, এটির ToString()পদ্ধতি। আমরা জেএস দেবগণ ইতিমধ্যে "কেবলমাত্র কাজ" এর উপর নির্ভরশীল! এছাড়াও, একটি দ্রুত switchএনামে সক্ষম হওয়া উচিত । সংখ্যার তুলনায় স্ট্রিং তুলনা করা ধীর গতির, সুতরাং আপনি switchযদি পূর্ণসংখ্যার পরিবর্তে স্ট্রিং ব্যবহার করেন তবে আপনি কিছুটা খারাপ পারফরম্যান্স পাবেন ।
রবাদশ 8820

501

হালনাগাদ

সকলকে আপোভোটের জন্য ধন্যবাদ, তবে আমি মনে করি নিচে আমার উত্তরটি জাভাস্ক্রিপ্টে এনামগুলি লেখার সর্বোত্তম উপায়। আরও বিশদে আমার ব্লগ পোস্টটি দেখুন: জাভাস্ক্রিপ্টে এনামস


নাম সতর্কতা ইতিমধ্যে সম্ভব:

if (currentColor == my.namespace.ColorEnum.RED) {
   // alert name of currentColor (RED: 0)
   var col = my.namespace.ColorEnum;
   for (var name in col) {
     if (col[name] == col.RED)
       alert(name);
   }
}

বিকল্পভাবে, আপনি মানগুলি অবজেক্ট তৈরি করতে পারেন, তাই আপনি কেকটি রাখতে পারেন এবং এটিও খেতে পারেন:

var SIZE = {
  SMALL : {value: 0, name: "Small", code: "S"}, 
  MEDIUM: {value: 1, name: "Medium", code: "M"}, 
  LARGE : {value: 2, name: "Large", code: "L"}
};

var currentSize = SIZE.MEDIUM;
if (currentSize == SIZE.MEDIUM) {
  // this alerts: "1: Medium"
  alert(currentSize.value + ": " + currentSize.name);
}

জাভাস্ক্রিপ্টে, এটি একটি গতিশীল ভাষা হিসাবে, পরে সেটে এনাম মানগুলি যুক্ত করা এমনকি সম্ভব:

// Add EXTRALARGE size
SIZE.EXTRALARGE = {value: 3, name: "Extra Large", code: "XL"};

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

// Add 'Extra Large' size, only knowing it's name
var name = "Extra Large";
SIZE[name] = {value: -1, name: name, code: "?"};

অবশ্যই এর অর্থ হ'ল কিছু অনুমান আর করা যায় না (সেই মান উদাহরণ হিসাবে আকারের জন্য সঠিক ক্রমকে উপস্থাপন করে)।

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

উদাহরণ

for (var sz in SIZE) {
  // sz will be the names of the objects in SIZE, so
  // 'SMALL', 'MEDIUM', 'LARGE', 'EXTRALARGE'
  var size = SIZE[sz]; // Get the object mapped to the name in sz
  for (var prop in size) {
    // Get all the properties of the size object, iterates over
    // 'value', 'name' and 'code'. You can inspect everything this way.        
  }
} 

এবং যাইহোক, আপনি যদি নেমস্পেসগুলিতে আগ্রহী হন তবে জাভাস্ক্রিপ্টের জন্য সহজ তবে শক্তিশালী নেমস্পেস এবং নির্ভরতা পরিচালনার জন্য আমার সমাধানটি একবার দেখতে চান: প্যাকেজস জেএস


তাহলে আপনি কীভাবে চলে যান এবং কেবলমাত্র একটি নাম তৈরি করতে পারেন যদি আপনার কেবল তার নাম থাকে?
জোহানিসমা

2
@ জোহানিসমা: এই ব্যবহারের বিষয়টি এনামদের পক্ষে সত্যিকার অর্থে আসে না কারণ তাদের পুরো ধারণাটি হ'ল আপনি সমস্ত মান আগেই জানেন। তবে জাভাস্ক্রিপ্টে আপনাকে অতিরিক্ত মান যুক্ত করতে বাধা দেওয়ার কিছু নেই। আমি আমার উত্তরে এর একটি উদাহরণ যুক্ত করব।
স্টিজন ডি উইট

2
বৈশিষ্ট্যগুলির পদ্ধতির সাথে আপনার পোস্টের লিঙ্কটির জন্য +1। মার্জিত যে মৌলিক ঘোষণাগুলি সহজ হয়, যেমন ওপি হিসাবে, যুক্ত হওয়া বৈশিষ্ট্যগুলি সহ যখন ইচ্ছা হয়।
গুদেয়

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

তুলনা এবং বিপরীত অনুসন্ধানের মতো সুন্দর বৈশিষ্ট্যগুলি সহ এটি রয়েছে এমন একটি গ্রন্থাগারও রয়েছে যা: github.com/adrai/enum
রোমান এম

83

নীচের লাইন: আপনি পারবেন না।

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

var DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...}

Document.Write("Enumerant: " + DaysEnum.tuesday);

এই পদ্ধতির সাথে সমস্যা? আপনি দুর্ঘটনাক্রমে আপনার গণকের পুনরায় সংজ্ঞা দিতে পারেন, বা ঘটনাক্রমে নকল গণকের মান থাকতে পারে। উদাহরণ স্বরূপ:

DaysEnum.monday = 4; // whoops, monday is now thursday, too

সম্পাদন করা

আর্টুর চ্যাজকার অবজেক্ট.ফ্রিজে সম্পর্কে কী? বৃহস্পতিবার সোমবার স্থাপন থেকে বিরত রাখতে কি সেই কাজ হবে না? - ফ্রাই কোয়াড

অবশ্যই, Object.freezeআমি যে সমস্যাটির বিষয়ে অভিযোগ করেছি তা সম্পূর্ণরূপে সমাধান করবে। আমি সবাইকে মনে করিয়ে দিতে চাই যে আমি যখন উপরেরটি লিখেছিলাম তখন Object.freezeআসলেই ছিল না।

এখন .... এখন এটি কিছু খুব আকর্ষণীয় সম্ভাবনা খুলবে ।

এডিট 2
তৈরি করার জন্য এখানে একটি খুব ভাল গ্রন্থাগার রয়েছে।

http://www.2ality.com/2011/10/enums.html

যদিও এটি সম্ভবত এনামগুলির প্রতিটি বৈধ ব্যবহারের সাথে খাপ খায় না, এটি অনেক দীর্ঘ যায়।


103
জাভাস্ক্রিপ্টে টাইপ সুরক্ষা আছে?
স্কট এভারেন্ডেন

3
সুতরাং বৈশিষ্ট্যের উদ্দেশ্যে মানচিত্র মানচিত্র রাখবেন না। গণক অ্যাক্সেস করতে গিটারটি ব্যবহার করুন ("ব্যক্তিগত" অবজেক্টের সম্পত্তি হিসাবে সঞ্চিত)। একটি var daysEnum = (function(){ var daysEnum = { monday: 1, tuesday: 2 }; return { get: function(value){ return daysEnum[value]; } } })(); daysEnum.get('monday'); // 1
নিষ্পাপ

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

2
আক্ষরিক সাথে কোড ছিটানো খুব রক্ষণাবেক্ষণের নয় তাই এটির জন্য ধ্রুবক তৈরি করা বোধগম্য। অবশ্যই জাভাস্ক্রিপ্টের কোনও ধ্রুবক নেই। সুতরাং মূলত এটি ক্লিন কোড লেখার একটি উপায়। এটি প্রয়োগ করা যায় না, তবে জাভাস্ক্রিপ্টে তেমন কিছু করা যায় না। আপনি ধ্রুবকগুলি বা ফাংশনগুলি বা বেশিরভাগ কিছুতেই পুনরায় সংজ্ঞায়িত করতে পারেন। EG: document.getElementById = ফাংশন () {সতর্কতা ("আপনি স্ক্রুড হয়েছেন J জাভাস্ক্রিপ্টটি টাইপসেফ নয়" ");};
স্টিজন ডি উইট

3
@ র্যান্ডলফো: আর্টুর কাজ্জাকের অবজেক্ট.ফ্রিজে কী? বৃহস্পতিবার সোমবার স্থাপন থেকে বিরত রাখতে কি সেই কাজ হবে না?
মাইকেল -

56

আমরা সবাই যা চাই তা এখানে:

function Enum(constantsList) {
    for (var i in constantsList) {
        this[constantsList[i]] = i;
    }
}

এখন আপনি আপনার এনাম তৈরি করতে পারেন:

var YesNo = new Enum(['NO', 'YES']);
var Color = new Enum(['RED', 'GREEN', 'BLUE']);

এটি করে, ধ্রুবকগুলিকে স্বাভাবিক উপায়ে (YesNo.YES, রঙ.GREEN) অ্যাক্সেস করা যায় এবং তারা একটি ক্রমযুক্ত মান (NO = 0, YES = 1; লাল = 0, গ্রিন = 1, নীল = 2) পায়।

আপনি এনাম.প্রোটোটাইপ ব্যবহার করেও পদ্ধতিগুলি যুক্ত করতে পারেন:

Enum.prototype.values = function() {
    return this.allValues;
    /* for the above to work, you'd need to do
            this.allValues = constantsList at the constructor */
};


সম্পাদনা করুন - ছোট উন্নতি - এখন varargs সহ: (দুর্ভাগ্যক্রমে এটি IE: S তে সঠিকভাবে কাজ করে না ... তারপরে পূর্ববর্তী সংস্করণটি থাকা উচিত)

function Enum() {
    for (var i in arguments) {
        this[arguments[i]] = i;
    }
}

var YesNo = new Enum('NO', 'YES');
var Color = new Enum('RED', 'GREEN', 'BLUE');

এই উত্তরের সরলতা পছন্দ!
মারকুইজো

: @Marquizzo (এবং ও.পি.) আমি এই উত্তর উপর ভিত্তি করে একটি উন্নত সংস্করণ তৈরি করা stackoverflow.com/a/60309416/1599699
অ্যান্ড্রু

53

বেশিরভাগ আধুনিক ব্রাউজারগুলিতে একটি প্রতীক আদিম উপাত্ত রয়েছে যা একটি গণনা তৈরি করতে ব্যবহার করা যেতে পারে। এটি এনামের ধরণের সুরক্ষা নিশ্চিত করবে যেহেতু প্রতিটি প্রতীক মানটি জাভাস্ক্রিপ্ট দ্বারা অনন্য হওয়ার গ্যারান্টিযুক্ত, অর্থাৎ Symbol() != Symbol()। উদাহরণ স্বরূপ:

const COLOR = Object.freeze({RED: Symbol(), BLUE: Symbol()});

ডিবাগিংকে সহজ করার জন্য, আপনি এনাম মানগুলিতে একটি বিবরণ যুক্ত করতে পারেন:

const COLOR = Object.freeze({RED: Symbol("RED"), BLUE: Symbol("BLUE")});

প্লঙ্কার ডেমো

উপর GitHub আপনি একটি মোড়কের যে enum আরম্ভ করা প্রয়োজন কোড সরলীকৃত পেতে পারবেন:

const color = new Enum("RED", "BLUE")

color.RED.toString() // Symbol(RED)
color.getName(color.RED) // RED
color.size // 2
color.values() // Symbol(RED), Symbol(BLUE)
color.toString() // RED,BLUE

এটি তত্ত্বের সঠিক উত্তর। অনুশীলনে, 2015 ব্রাউজার সমর্থন পর্যাপ্ত থেকে অনেক দূরে। এখন পর্যন্ত উত্পাদন প্রস্তুত নয়।
vbraun

1
ব্রাউজার সমর্থন এখনও না থাকলেও এটি সর্বোত্তম উত্তর যেহেতু Symbolএটির উদ্দেশ্যটি নিকটেই রয়েছে ।
rvighne

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

3
এটি কি কেবলমাত্র আমি বা Object.freezeকেবল সেই লোকদের জন্য যারা "নিজের ঝুঁকিতে মণিপ্যাচ" জেএসের সামাজিক চুক্তি এই সত্যটি গ্রহণ করেন নি?
অ্যান্ডি

@ এবং হ্যাঁ সিরিয়ালাইজেশন বিরক্তিকর। আমি একজন স্পষ্ট করছেন শেষ পর্যন্ত toJSON: ধারণকারী বর্গ উপর এই পদ্ধতির ব্যবহার করতে stackoverflow.com/questions/58499828/...
সিরো Santilli冠状病毒审查六四事件法轮功

30

𝗡𝗮𝗺𝗲𝘀 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀

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


wvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwv

ইন্ডসকোর-নোটেশন ভেরিয়েবলগুলি

উপরের চার্টে এবং নীচের উদাহরণে প্রদর্শিত হিসাবে, এখানে শুরু করার জন্য পাঁচটি সহজ ধাপ রয়েছে:

  1. গণনা গোষ্ঠীর জন্য একটি নাম নির্ধারণ করুন। এমন একটি বিশেষত্বের কথা চিন্তা করুন যা গণনার উদ্দেশ্যে বা কমপক্ষে অন্তর্ভুক্ত নথির বর্ণনা দিতে পারে। উদাহরণস্বরূপ, ব্যবহারকারীর দ্বারা বেছে নেওয়া রঙগুলি উপস্থাপন করে এমন একটি গণনার নাম রঙের চেয়ে COLORCHOICES নামে ভাল হতে পারে।
  2. দলে তালিকাটি পারস্পরিক-একচেটিয়া বা স্বতন্ত্র কিনা তা সিদ্ধান্ত নিন। যদি পারস্পরিক-একচেটিয়া হয় তবে প্রতিটি অঙ্কিত পরিবর্তনশীল নামটি শুরু করুন ENUM_। স্বাধীন বা পাশাপাশি থাকলে, ব্যবহার করুন INDEX_
  3. প্রতিটি প্রবেশের জন্য, একটি নতুন স্থানীয় ভেরিয়েবল তৈরি করুন যার নামটি শুরু হয় ENUM_বা এর সাথে শুরু হয় INDEX_, তারপরে গ্রুপের নাম, তারপরে একটি আন্ডারস্কোর, তারপরে সম্পত্তিটির জন্য একটি অনন্য বন্ধুত্বপূর্ণ নাম
  4. একটি যোগ করুন ENUMLENGTH_, ENUMLEN_, INDEXLENGTH_, অথবা INDEXLEN_(কিনা LEN_বা LENGTH_খুব শেষে ব্যক্তিগত পছন্দের) গণিত পরিবর্তনশীল। আপনার কোডটিতে যেখানে সম্ভব সেখানে আপনার এই পরিবর্তনশীলটি ব্যবহার করা উচিত তা নিশ্চিত করার জন্য যে গণনাতে একটি অতিরিক্ত এন্ট্রি যুক্ত করা এবং এই মান বাড়ানো আপনার কোডটি ভঙ্গ করবে না।
  5. ধারাবাহিক প্রতিটি গণিত পরিবর্তনশীল একটি মান এক শেষ চেয়ে বেশি দাও, 0. থেকে শুরু এই পৃষ্ঠাতে মন্তব্য বলে আছে 0একটি গণিত মান কারণ হিসেবে ব্যবহার করা উচিত 0 == null, 0 == false, 0 == "", এবং অন্যান্য জাতীয় পাগলামি। আমি আপনাকে জমা দিয়েছি যে, একই সময়ে এই সমস্যাটি এড়াতে এবং একই সাথে পারফরম্যান্স বাড়ানোর জন্য, সর্বদা ব্যবহার করুন ===এবং ==আপনার কোডে typeof(প্রাক্তন typeof X == "string") বাদে কখনই উপস্থিত না হতে দিন । আমার ব্যবহারের সমস্ত বছরগুলিতে, ===0 টি একবার গণনার মান হিসাবে ব্যবহার করার ক্ষেত্রে আমার একবারও সমস্যা হয়নি। আপনি যদি এখনও চটজলদি 1হন তবে অনেক ক্ষেত্রে পারফরম্যান্স জরিমানা ছাড়াই ENUM_গণ্যকরণের ক্ষেত্রে (তবে INDEX_গণিতে নয়) প্রাথমিক মান হিসাবে ব্যবহৃত হতে পারে ।
const ENUM_COLORENUM_RED   = 0;
const ENUM_COLORENUM_GREEN = 1;
const ENUM_COLORENUM_BLUE  = 2;
const ENUMLEN_COLORENUM    = 3;

// later on

if(currentColor === ENUM_COLORENUM_RED) {
   // whatever
}

কখন কীভাবে ব্যবহার করব INDEX_এবং কখন ব্যবহার করব তা এখানে আমার মনে আছে ENUM_:

// Precondition: var arr = []; //
arr[INDEX_] = ENUM_;

তবে, ENUM_নির্দিষ্ট পরিস্থিতিতে, সূচি হিসাবে যথাযথ হতে পারে যেমন প্রতিটি আইটেমের উপস্থিতি গণনা করার সময়।

const ENUM_PET_CAT = 0,
      ENUM_PET_DOG = 1,
      ENUM_PET_RAT = 2,
      ENUMLEN_PET  = 3;

var favoritePets = [ENUM_PET_CAT, ENUM_PET_DOG, ENUM_PET_RAT,
                    ENUM_PET_DOG, ENUM_PET_DOG, ENUM_PET_CAT,
                    ENUM_PET_RAT, ENUM_PET_CAT, ENUM_PET_DOG];

var petsFrequency = [];

for (var i=0; i<ENUMLEN_PET; i=i+1|0)
  petsFrequency[i] = 0;

for (var i=0, len=favoritePets.length|0, petId=0; i<len; i=i+1|0)
  petsFrequency[petId = favoritePets[i]|0] = (petsFrequency[petId]|0) + 1|0;

console.log({
    "cat": petsFrequency[ENUM_PET_CAT],
    "dog": petsFrequency[ENUM_PET_DOG],
    "rat": petsFrequency[ENUM_PET_RAT]
});

লক্ষ্য করুন যে, উপরের কোডটিতে, নতুন ধরণের পোষা প্রাণীর মধ্যে যুক্ত করা সত্যিই সহজ: আপনাকে কেবল নতুন এন্ট্রি যুক্ত করতে হবে ENUM_PET_RATএবং ENUMLEN_PETসেই অনুযায়ী আপডেট করতে হবে । গণনার অন্যান্য সিস্টেমে একটি নতুন এন্ট্রি যুক্ত করা আরও কঠিন এবং বগী হতে পারে।


wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw wvwvw wvwvwv vwvwvw wvwvvw wvwwvw xwvwvwvw wvwvw

𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵 𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻

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

সংযোজন এক্সটেনশন ডায়াগ্রাম

(function(window){
    "use strict";
    var parseInt = window.parseInt;

    // use INDEX_ when representing the index in an array instance
    const INDEX_PIXELCOLOR_TYPE = 0, // is a ENUM_PIXELTYPE
          INDEXLEN_PIXELCOLOR   = 1,
          INDEX_SOLIDCOLOR_R    = INDEXLEN_PIXELCOLOR+0,
          INDEX_SOLIDCOLOR_G    = INDEXLEN_PIXELCOLOR+1,
          INDEX_SOLIDCOLOR_B    = INDEXLEN_PIXELCOLOR+2,
          INDEXLEN_SOLIDCOLOR   = INDEXLEN_PIXELCOLOR+3,
          INDEX_ALPHACOLOR_R    = INDEXLEN_PIXELCOLOR+0,
          INDEX_ALPHACOLOR_G    = INDEXLEN_PIXELCOLOR+1,
          INDEX_ALPHACOLOR_B    = INDEXLEN_PIXELCOLOR+2,
          INDEX_ALPHACOLOR_A    = INDEXLEN_PIXELCOLOR+3,
          INDEXLEN_ALPHACOLOR   = INDEXLEN_PIXELCOLOR+4,
    // use ENUM_ when representing a mutually-exclusive species or type
          ENUM_PIXELTYPE_SOLID = 0,
          ENUM_PIXELTYPE_ALPHA = 1,
          ENUM_PIXELTYPE_UNKNOWN = 2,
          ENUMLEN_PIXELTYPE    = 2;

    function parseHexColor(inputString) {
        var rawstr = inputString.trim().substring(1);
        var result = [];
        if (rawstr.length === 8) {
            result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_ALPHA;
            result[INDEX_ALPHACOLOR_R] = parseInt(rawstr.substring(0,2), 16);
            result[INDEX_ALPHACOLOR_G] = parseInt(rawstr.substring(2,4), 16);
            result[INDEX_ALPHACOLOR_B] = parseInt(rawstr.substring(4,6), 16);
            result[INDEX_ALPHACOLOR_A] = parseInt(rawstr.substring(4,6), 16);
        } else if (rawstr.length === 4) {
            result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_ALPHA;
            result[INDEX_ALPHACOLOR_R] = parseInt(rawstr[0], 16) * 0x11;
            result[INDEX_ALPHACOLOR_G] = parseInt(rawstr[1], 16) * 0x11;
            result[INDEX_ALPHACOLOR_B] = parseInt(rawstr[2], 16) * 0x11;
            result[INDEX_ALPHACOLOR_A] = parseInt(rawstr[3], 16) * 0x11;
        } else if (rawstr.length === 6) {
            result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_SOLID;
            result[INDEX_SOLIDCOLOR_R] = parseInt(rawstr.substring(0,2), 16);
            result[INDEX_SOLIDCOLOR_G] = parseInt(rawstr.substring(2,4), 16);
            result[INDEX_SOLIDCOLOR_B] = parseInt(rawstr.substring(4,6), 16);
        } else if (rawstr.length === 3) {
            result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_SOLID;
            result[INDEX_SOLIDCOLOR_R] = parseInt(rawstr[0], 16) * 0x11;
            result[INDEX_SOLIDCOLOR_G] = parseInt(rawstr[1], 16) * 0x11;
            result[INDEX_SOLIDCOLOR_B] = parseInt(rawstr[2], 16) * 0x11;
        } else {
            result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_UNKNOWN;
        }
        return result;
    }

    // the red component of green
    console.log(parseHexColor("#0f0")[INDEX_SOLIDCOLOR_R]);
    // the alpha of transparent purple
    console.log(parseHexColor("#f0f7")[INDEX_ALPHACOLOR_A]); 
    // the enumerated array for turquoise
    console.log(parseHexColor("#40E0D0"));
})(self);

(দৈর্ঘ্য: 2,450 বাইট)

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


wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw wvwvw wvwvwv vwvwvw wvwvvw wvwwvw xwvwvwvw wvwvw

𝗖𝗼𝗺𝗽𝗶𝗹𝗲𝗿 𝗪𝗶𝘁𝗵 𝗖𝗹𝗼𝘀𝘂𝗿𝗲 𝗖𝗼𝗺𝗽𝗶𝗹𝗲𝗿

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

ক্লোজার কম্পাইলারের মাধ্যমে উইন্ডিং কোড

'use strict';(function(e){function d(a){a=a.trim().substring(1);var b=[];8===a.length?(b[0]=1,b[1]=c(a.substring(0,2),16),b[2]=c(a.substring(2,4),16),b[3]=c(a.substring(4,6),16),b[4]=c(a.substring(4,6),16)):4===a.length?(b[1]=17*c(a[0],16),b[2]=17*c(a[1],16),b[3]=17*c(a[2],16),b[4]=17*c(a[3],16)):6===a.length?(b[0]=0,b[1]=c(a.substring(0,2),16),b[2]=c(a.substring(2,4),16),b[3]=c(a.substring(4,6),16)):3===a.length?(b[0]=0,b[1]=17*c(a[0],16),b[2]=17*c(a[1],16),b[3]=17*c(a[2],16)):b[0]=2;return b}var c=
e.parseInt;console.log(d("#0f0")[1]);console.log(d("#f0f7")[4]);console.log(d("#40E0D0"))})(self);

(দৈর্ঘ্য: 605 বাইট)

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


wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw wvwvw wvwvwv vwvwvw wvwvvw wvwwvw xwvwvwvw wvwvw

𝗦𝗶𝘇𝗲 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲

এখন, আসুন আমরা দেখে নেওয়া যাক যে এগুলির মধ্যে কোনও গণনা ছাড়াই সমমানের ফাইলটি কত বড় হবে।

এনুমারেশন ব্যবহার না করে উত্স (দৈর্ঘ্য: 1,973 বাইট (477 বাইট
এনুমারেটেড কোডের চেয়ে কম!)) এনুমিউরেশন ব্যবহার না করে মিনাইফ করা (দৈর্ঘ্য: 843 বাইট ( গণিত কোডের চেয়ে 238 বাইট বেশি ))

কোড আকারের তালিকা



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


wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw wvwvw wvwvwv vwvwvw wvwvvw wvwwvw xwvwvwvw wvwvw

𝗙𝗶𝘅𝗶𝗻𝗴 🤝 𝗕𝘂𝗴 𝗙𝗶𝘅𝗶𝗻𝗴

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

// JG = Jack Giffin
const ENUM_JG_COLORENUM_RED   = 0,
      ENUM_JG_COLORENUM_GREEN = 1,
      ENUM_JG_COLORENUM_BLUE  = 2,
      ENUMLEN_JG_COLORENUM    = 3;

// later on

if(currentColor === ENUM_JG_COLORENUM_RED) {
   // whatever
}

// PL = Pepper Loftus
// BK = Bob Knight
const ENUM_PL_ARRAYTYPE_UNSORTED   = 0,
      ENUM_PL_ARRAYTYPE_ISSORTED   = 1,
      ENUM_BK_ARRAYTYPE_CHUNKED    = 2, // added by Bob Knight
      ENUM_JG_ARRAYTYPE_INCOMPLETE = 3, // added by jack giffin
      ENUMLEN_PL_COLORENUM         = 4;

// later on

if(
  randomArray === ENUM_PL_ARRAYTYPE_UNSORTED ||
  randomArray === ENUM_BK_ARRAYTYPE_CHUNKED
) {
   // whatever
}

𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲

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

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

/// Hashmaps are slow, even with JIT juice
var ref = {};
ref.count = 10;
ref.value = "foobar";

উপরের কোডটি নীচের কোডের সাথে তুলনা করুন।

/// Arrays, however, are always lightning fast
const INDEX_REFERENCE_COUNT = 0;
const INDEX_REFERENCE_VALUE = 1;
const INDEXLENGTH_REFERENCE = 2;

var ref = [];
ref[INDEX_REFERENCE_COUNT] = 10;
ref[INDEX_REFERENCE_VALUE] = "foobar";

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

/// Hashmaps are slow, even with JIT juice
var a={count:10,value:"foobar"};

গণনাবিহীন মিনিফায়েড কোড উপরে এবং গণনাগুলির সাথে সংযুক্ত কোড নীচে।

/// Arrays, however, are always lightning fast
var a=[10,"foobar"];

উপরের উদাহরণটি প্রমাণ করে যে উন্নত পারফরম্যান্সের পাশাপাশি, গণিত কোডটি একটি ছোট ছোট ফাইলের আকারেরও ফলাফল করে।


wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw wvwvw wvwvwv vwvwvw wvwvvw wvwwvw xwvwvwvw wvwvw

𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴

তদ্ব্যতীত, শীর্ষে থাকা এই ব্যক্তির ব্যক্তিগত চেরি জাভাস্ক্রিপ্ট মোডে কোডমিরার পাঠ্য সম্পাদক সহ এই গণনাটির ফর্মটি ব্যবহার করছে । কোডমিরারের জাভাস্ক্রিপ্ট সিনট্যাক্স হাইলাইটিং মোড বর্তমান সুযোগে স্থানীয় ভেরিয়েবলগুলিকে হাইলাইট করে। এইভাবে, আপনি তাত্ক্ষণিকভাবে জানেন যখন আপনি কোনও ভেরিয়েবলের নামটি সঠিকভাবে টাইপ করেন কারণ যদি ভেরিয়েবলের নামটি আগে varকীওয়ার্ড দিয়ে ঘোষণা করা হত , তবে ভেরিয়েবলের নামটি একটি বিশেষ বর্ণকে পরিণত করে (ডিফল্টরূপে সায়ান)। এমনকি আপনি কোডমিরার ব্যবহার না করলেও অন্তত ব্রাউজারটি সহায়ককে ছুড়ে দেয়[variable name] is not definedভুল টাইপ করা গণনার নাম সহ কোডটি কার্যকর করার সময় ব্যতিক্রম। এছাড়াও, জাভাস্ক্রিপ্ট সরঞ্জামগুলি যেমন জেএসলিন্ট এবং ক্লোজার কমপাইলার যখন আপনি একটি অঙ্কের পরিবর্তনশীল নামে ভুল টাইপ করেন তখন আপনাকে বলার বিষয়ে খুব জোরে। কোডমিরার, ব্রাউজার এবং বিভিন্ন জাভাস্ক্রিপ্ট সরঞ্জাম একসাথে রাখা খুব সহজেই সহজ এবং সত্যিই সহজ হিসাবে এই ফর্মটি ডিবাগিং করে।

কোডমিরর হাইলাইট বিক্ষোভ

const ENUM_COLORENUM_RED   = 0,
      ENUM_COLORENUM_GREEN = 1,
      ENUM_COLORENUM_BLUE  = 2,
      ENUMLEN_COLORENUM    = 3;
var currentColor = ENUM_COLORENUM_GREEN;

if(currentColor === ENUM_COLORENUM_RED) {
   // whatever
}

if(currentColor === ENUM_COLORENUM_DNE) {
   // whatever
}

উপরের স্নিপেটে, আপনাকে একটি ত্রুটি দিয়ে সতর্ক করা হয়েছিল কারণ ENUM_COLORENUM_DNEএটি বিদ্যমান নেই।


wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw wvwvw wvwvwv vwvwvw wvwvvw wvwwvw xwvwvwvw wvwvw

☑ ☑

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

সহায়ক প্রশ্নটি পড়ার পরে, আমি প্রশ্ন বাক্সের উপরের বাম উপরে তীর ক্লিক করে তাদের লেখায় সময় দেওয়ার জন্য লেখককে ধন্যবাদ জানাই। প্রতিটি উত্তর বাক্সে এইগুলির একটি তীর থাকে।


অঁ্যা। আমি দৃ strongly়ভাবে পাঠেরযোগ্যতা এবং কোডের আকারের ব্যবহারের সহজতরতা এবং বোঝার পক্ষে।
অ্যান্ড্রু

1
@ অ্যান্ড্রু আমার উত্তর সহ, আপনি উভয় থাকতে পারে। আমার উত্তরটি কোড ব্যবহার / পরিচালনা এবং সবচেয়ে ক্ষুদ্রতম কোডযুক্ত আকারের পক্ষে সবচেয়ে সহজ ফলাফল দেয় 🙂
জ্যাক গিফিন

1
@ অ্যান্ড্রু আমি আমার উত্তরের রঙ বিশ্লেষণকারী উদাহরণটিতে আপনার তবুও আরেকটি এনাম (ওয়াইএ!) প্রয়োগ করার চেষ্টা করেছি। তবে, আমি বেশ কয়েকটি সমস্যা পেয়েছি যা আপনি সমাধান করতে চাইতে পারেন। YEA এর সাবক্লাসগুলির সাথে গণনাগুলি বাড়ানোর কোনও উপায় নেই, আমাকে পৃথক অভিভাবক এবং শিশু শ্রেণি তৈরি করতে বাধ্য করে, যা বড় প্রকল্পগুলিতে পরিচালনা করা বেশ কঠিন। YEA এন্ট্রি বিদ্যমান (প্রাক্তন colors.REEDফলন undefined) নিশ্চিত করে না , সুতরাং টাইপসগুলি অধরা কনড্রুম তৈরি করে। YEA সূচী এবং আইডি হিসাবে গণনার ব্যবহারের মধ্যে পার্থক্য রাখে না, বিভ্রান্তিকর কোডের দিকে নিয়ে যায় যেখানে সমস্ত কিছুই একই দেখায়। …
জ্যাক গিফিন

1
@ অ্যান্ড্রু… ওয়াইএ ক্লোজার কমপাইলারের ক্ষুদ্রতর করার ক্ষমতাকে বাধা দেয়। YEA (3549 বাইট) এর সোর্স কোডটি YEA (1344 বাইট) সহ মাইনিফাইড কোডের সাথে আমার দ্রবণ (604 বাইট) এর সাথে সংযুক্ত কোডের সাথে তুলনা করুন। অবশেষে, ওয়াইএ "নাম দ্বারা ম্যাপিং" জড়িত কারণ এটি স্ট্রিংয়ের নামগুলিকে গণিত আইডি থেকে পৃথক করে। খনি কেবল আইডি বিবেচনা করে, তাই কোনও "নাম দ্বারা ম্যাপিং" দরকার নেই, যা সহজ নকশা এবং আরও ভাল পারফরম্যান্সের দিকে পরিচালিত করে। আপনার সমাধান ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ, তবে এটি ব্যবহারিক হওয়ার আগে এটির অনেকগুলি সমাধানের প্রয়োজন।
জ্যাক গিফিন

1
@ অ্যান্ড্রু আপনার মতামতের জন্য আপনি যেমন অধিকারী আমি তেমনই আমার 👍
জ্যাক গিফিন

23

আমি আমার এনামগুলিকে যেমন ভালবাসি তেমনি আমি এই নিয়ে খেলছি। =)

ব্যবহার করে Object.definePropertyআমি মনে করি আমি কিছুটা কার্যকর সমাধান নিয়ে এসেছি।

এখানে একটি jsfiddle: http://jsfiddle.net/ZV4A6/

এই পদ্ধতিটি ব্যবহার করে .. আপনাকে (তত্ত্ব অনুসারে) সেই বস্তুর অন্যান্য বৈশিষ্ট্যগুলিকে প্রভাবিত না করে কোনও বস্তুর জন্য এনাম মানগুলি কল করতে এবং সংজ্ঞা দিতে সক্ষম হওয়া উচিত।

Object.defineProperty(Object.prototype,'Enum', {
    value: function() {
        for(i in arguments) {
            Object.defineProperty(this,arguments[i], {
                value:parseInt(i),
                writable:false,
                enumerable:true,
                configurable:true
            });
        }
        return this;
    },
    writable:false,
    enumerable:false,
    configurable:false
}); 

অ্যাট্রিবিউট কারণে writable:falseএই উচিত এটি নিরাপদ টাইপ করা।

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

var EnumColors={};
EnumColors.Enum('RED','BLUE','GREEN','YELLOW');
EnumColors.RED;    // == 0
EnumColors.BLUE;   // == 1
EnumColors.GREEN;  // == 2
EnumColors.YELLOW; // == 3

3
আপনি যদি return this;এনামের শেষে যুক্ত করেন তবে আপনি এটি করতে পারেন:var EnumColors = {}.Enum('RED','BLUE','GREEN','YELLOW');
এইচবিপি

আমি এটি বিবেচনা করিনি, কারণ এটি জিনিসগুলি করার আমার সাধারণ পদ্ধতি নয়। তবে আপনি একেবারে সঠিক! আমি যে এ সম্পাদনা করব।
ডানকান

আমি সত্যিই এটি পছন্দ করি যদিও আমি অবজেক্ট স্পেস (গ্লোবাল ফাংশন এনইউএম সহ) উপার্জনের বড় ফ্যান নই। এটিকে একটি মেকেনাম ফাংশনে রূপান্তরিত করা হয়েছে এবং alচ্ছিক সংখ্যার কার্যনির্বাহী => ভার মিশ্রিত = মেকেনাম ('ব্ল্যাক', ED লাল: 0x0F00, নীল: 0 X0F, গ্রিন: 0x0F0, সাদা: 0x0FFF, এক: 1}, দুই, তিন, চার) ; // নীচে উত্তর হিসাবে আমার কোড যুক্ত করা হচ্ছে। ধন্যবাদ।
অ্যান্ড্রু ফিলিপস

সত্যি কথা বলতে, আমি এমনকি এটি আর ব্যবহার করি না। আমি গুগলের ক্লোজার কম্পাইলার ব্যবহার করছি এবং আপনি যদি উন্নত সেটিংস ব্যবহার করেন তবে এটি খুব ভালভাবে কাজ করে না (বা এটি কেবল জিনিসগুলিকে জটিল করে তোলে)। সুতরাং আমি ঠিক ফিরে স্ট্যান্ডার্ড অবজেক্ট স্বরলিপি।
ডানকান

1
falseএর জন্য ডিফল্ট, writable, enumerableএবং configurable। খেলাপি খেলাপি চিবানোর দরকার নেই।
16

23

জাভাস্ক্রিপ্ট প্রক্সি ব্যবহার করুন

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

class Enum {
  constructor(enumObj) {
    const handler = {
      get(target, name) {
        if (typeof target[name] != 'undefined') {
          return target[name];
        }
        throw new Error(`No such enumerator: ${name}`);
      },
      set() {
        throw new Error('Cannot add/update properties on an Enum instance after it is defined')
      }
    };

    return new Proxy(enumObj, handler);
  }
}

তারপরে ক্লাসটি ইনস্ট্যান্ট করে এনাম তৈরি করুন:

const roles = new Enum({
  ADMIN: 'Admin',
  USER: 'User',
});

সম্পূর্ণ ব্যাখ্যা:

Traditionalতিহ্যবাহী ভাষা থেকে প্রাপ্ত এনামগুলির একটি খুব উপকারী বৈশিষ্ট্য হ'ল যদি আপনি কোনও অ্যানুমেটারের অ্যাক্সেস করার চেষ্টা করেন যা অস্তিত্বহীন।

অতিরিক্ত মানগুলি দুর্ঘটনাক্রমে / দূষিতভাবে যুক্ত হওয়া থেকে রোধ করার জন্য উপহাস করা এনাম কাঠামো হিম করার পাশাপাশি অন্য কোনও উত্তরই এনামসের অন্তর্গত বৈশিষ্ট্যটিকে সম্বোধন করে না।

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

আমাকে ভুল করবেন না, undefinedঅপরিজ্ঞাত বৈশিষ্ট্যগুলি অ্যাক্সেস করার সময় জাভাস্ক্রিপ্টের ফিরে আসার আচরণটি আসলে ভাষার একটি খুব শক্তিশালী বৈশিষ্ট্য, তবে আপনি যখন traditionalতিহ্যবাহী এনাম কাঠামোগুলি উপহাস করার চেষ্টা করছেন তখন এটি আপনি চান এমন বৈশিষ্ট্য নয়।

প্রক্সি অবজেক্টগুলি এখানে আলোকিত করে। প্রক্সিগুলি ES6 (ES2015) প্রবর্তনের সাথে ভাষাতে মানক করা হয়েছিল। এমডিএন থেকে বর্ণনা এখানে:

প্রক্সি অবজেক্টটি মৌলিক ক্রিয়াকলাপগুলির জন্য কাস্টম আচরণকে সংজ্ঞায়িত করতে ব্যবহৃত হয় (উদাহরণস্বরূপ সম্পত্তি অনুসন্ধান, অ্যাসাইনমেন্ট, গণনা, ফাংশন অনুরোধ, ইত্যাদি)।

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

এখানে একটি স্বতন্ত্র উদাহরণ যা এনামগুলি অনুকরণ করতে প্রক্সি অবজেক্টটি ব্যবহার করে। এই উদাহরণে গণকগণ হ'ল মানক এইচটিটিপি পদ্ধতি (যেমন "জিইটি", "পোষ্ট" ইত্যাদি):

// Class for creating enums (13 lines)
// Feel free to add this to your utility library in 
// your codebase and profit! Note: As Proxies are an ES6 
// feature, some browsers/clients may not support it and 
// you may need to transpile using a service like babel

class Enum {
  // The Enum class instantiates a JavaScript Proxy object.
  // Instantiating a `Proxy` object requires two parameters, 
  // a `target` object and a `handler`. We first define the handler,
  // then use the handler to instantiate a Proxy.

  // A proxy handler is simply an object whose properties
  // are functions which define the behavior of the proxy 
  // when an operation is performed on it. 
  
  // For enums, we need to define behavior that lets us check what enumerator
  // is being accessed and what enumerator is being set. This can be done by 
  // defining "get" and "set" traps.
  constructor(enumObj) {
    const handler = {
      get(target, name) {
        if (typeof target[name] != 'undefined') {
          return target[name]
        }
        throw new Error(`No such enumerator: ${name}`)
      },
      set() {
        throw new Error('Cannot add/update properties on an Enum instance after it is defined')
      }
    }


    // Freeze the target object to prevent modifications
    return new Proxy(enumObj, handler)
  }
}


// Now that we have a generic way of creating Enums, lets create our first Enum!
const httpMethods = new Enum({
  DELETE: "DELETE",
  GET: "GET",
  OPTIONS: "OPTIONS",
  PATCH: "PATCH",
  POST: "POST",
  PUT: "PUT"
})

// Sanity checks
console.log(httpMethods.DELETE)
// logs "DELETE"

try {
  httpMethods.delete = "delete"
} catch (e) {
console.log("Error: ", e.message)
}
// throws "Cannot add/update properties on an Enum instance after it is defined"

try {
  console.log(httpMethods.delete)
} catch (e) {
  console.log("Error: ", e.message)
}
// throws "No such enumerator: delete"


পাশে: হেক একটি প্রক্সি কি?

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


MyEnum.valueOf ("someStringValue") এর মতো কিছু কীভাবে করবেন? প্রত্যাশিত: যদি ইনপুট স্ট্রিংটিতে গণকের একটি উপাদানের একটি মান থাকে তবে আইটেমটি ফেরত দেওয়া উচিত। যদি কোনও আইটেমের স্ট্রিং মান না থাকে তবে ব্যতিক্রম ছুঁড়ে ফেলুন।
sscarduzio

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

আমার এনাম হ'ল কনস্ট লগভেলভেনম = নতুন এনুম ({ইনফো: "তথ্য", ডিইবিইউজি: "ডিবাগ"}) এবং আমি ইনপুট থেকে একটি স্বেচ্ছাসেবী স্ট্রিং "তথ্য" বা "ডিবাগ" পার্স করি। সুতরাং আমার কাছে বর্তমানের মতো লগলিভেল = লগলিভেনম.পারসঅরথ্রো (সেটিংস.জেট ("লগ_এলভেল")) এর মতো কিছু দরকার
sscarduzio

1
তুমি শুধু করতে পারলে না কেন logLevelEnum[settings.get("log_level")]? parseOrThrowপ্রক্সি ট্র্যাপগুলি ইতিমধ্যে আপনার জন্য যা করছে তা যোগ করা কেবল পুনরাবৃত্ত হবে।
গোবিন্দ রায়

17

এটি আমার জানা একটি পুরানো, তবে এটি টাইপস্ক্রিপ্ট ইন্টারফেসের মাধ্যমে যেভাবে প্রয়োগ করা হয়েছে তা হ'ল:

var MyEnum;
(function (MyEnum) {
    MyEnum[MyEnum["Foo"] = 0] = "Foo";
    MyEnum[MyEnum["FooBar"] = 2] = "FooBar";
    MyEnum[MyEnum["Bar"] = 1] = "Bar";
})(MyEnum|| (MyEnum= {}));

এটি আপনাকে MyEnum.Bar1 প্রদান করে এবং উভয় MyEnum[1]ঘোষণার আদেশ নির্বিশেষে "বার" ফেরত দেয় উভয়কেই সন্ধান করতে সক্ষম করে ।


1
প্লাস মাইনেম ["বার"] যা কাজ করে যা 1 ... <3
টাইপসক্রিপ্ট এখনও

3
এবং অবশ্যই যদি আপনি প্রকৃতপক্ষে টাইপস্ক্রিপ্ট ব্যবহার করছেন:enum MyEnum { Foo, Bar, Foobar }
সংসদ

16

ইন ES7 , আপনি স্ট্যাটিক বৈশিষ্ট্যাবলী উপর নির্ভর একটি মার্জিত ENUM করতে পারেন:

class ColorEnum  {
    static RED = 0 ;
    static GREEN = 1;
    static BLUE = 2;
}

তারপর

if (currentColor === ColorEnum.GREEN ) {/*-- coding --*/}

সুবিধা (আক্ষরিক বস্তুর পরিবর্তে বর্গ ব্যবহারের) একটি পিতা বা মাতা ক্লাস আছে হয় Enumতারপর সব আপনার Enums হবে প্রসারিত যে বর্গ।

 class ColorEnum  extends Enum {/*....*/}

4
দয়া করে ব্যাখ্যা করতে পারেন কেন পিতামাতাদের ক্লাস করা একটি সুবিধা? আমার মনে হচ্ছে আমি কিছু মিস করছি!
জন জি

7
এটা করবেন না। new ColorEnum()একেবারে কোনও বুদ্ধি নেই।
বার্গি


ভাষাটি একবার দেশীয়ভাবে সমর্থন না করলে এই সম্মেলনটি বজায় রাখতে এবং এই জাতীয় ব্যবহার করতে হবে! আমি রাজী!
xpto

আমি মনে করি (?) ওপি কী পাচ্ছে, তা হ'ল: খাঁটি স্ট্যাটিকের সুবিধাটি হ'ল এটি সিঙ্গলটন হিসাবে সর্বত্র পাওয়া যায় এবং আপনার ক্লাসটি ইনস্ট্যান্ট করার দরকার নেই - ওপি আপনাকে পরামর্শ দেয় না যে! আমি মনে করি তিনি কি বলছে যে সুপারক্লাস হয় Enumমান রয়েছে স্ট্যাটিক এটিতে গণনাকারী পদ্ধতি, মত getValues(), getNames(), iterate(), ইত্যাদি যদি সেই ক্ষেত্রে, তোমরা প্রত্যেকে নতুন ধরনের জন্য তাদের reimplement হবে না enum
ইঞ্জিনিয়ার

15

এটিই আমি সমাধানটি ব্যবহার করি।

function Enum() {
    this._enums = [];
    this._lookups = {};
}

Enum.prototype.getEnums = function() {
    return _enums;
}

Enum.prototype.forEach = function(callback){
    var length = this._enums.length;
    for (var i = 0; i < length; ++i){
        callback(this._enums[i]);
    }
}

Enum.prototype.addEnum = function(e) {
    this._enums.push(e);
}

Enum.prototype.getByName = function(name) {
    return this[name];
}

Enum.prototype.getByValue = function(field, value) {
    var lookup = this._lookups[field];
    if(lookup) {
        return lookup[value];
    } else {
        this._lookups[field] = ( lookup = {});
        var k = this._enums.length - 1;
        for(; k >= 0; --k) {
            var m = this._enums[k];
            var j = m[field];
            lookup[j] = m;
            if(j == value) {
                return m;
            }
        }
    }
    return null;
}

function defineEnum(definition) {
    var k;
    var e = new Enum();
    for(k in definition) {
        var j = definition[k];
        e[k] = j;
        e.addEnum(j)
    }
    return e;
}

এবং আপনি আপনার এনামগুলিকে এই জাতীয় সংজ্ঞা দিন:

var COLORS = defineEnum({
    RED : {
        value : 1,
        string : 'red'
    },
    GREEN : {
        value : 2,
        string : 'green'
    },
    BLUE : {
        value : 3,
        string : 'blue'
    }
});

এবং এভাবেই আপনি আপনার এনামগুলিতে অ্যাক্সেস পাবেন:

COLORS.BLUE.string
COLORS.BLUE.value
COLORS.getByName('BLUE').string
COLORS.getByValue('value', 1).string

COLORS.forEach(function(e){
    // do what you want with e
});

আমি সাধারণত বার্তা অবজেক্ট থেকে এনামগুলি ম্যাপ করার জন্য শেষ 2 টি পদ্ধতি ব্যবহার করি।

এই পদ্ধতির কিছু সুবিধা:

  • এনামগুলি ঘোষণা করা সহজ
  • আপনার এনামগুলিতে অ্যাক্সেস করা সহজ
  • আপনার এনামগুলি জটিল ধরণের হতে পারে
  • আপনি যদি getByValue প্রচুর ব্যবহার করে থাকেন তবে এনাম ক্লাসে কিছু সাহসী ক্যাশে রয়েছে

কিছু অসুবিধা:

  • কিছু অগোছালো মেমরি পরিচালনা সেখানে চলছে, কারণ আমি এনামগুলিতে উল্লেখ রেখেছি
  • এখনও কোনও ধরণের সুরক্ষা নেই

14

আক্ষরিক একটি বস্তু তৈরি করুন:

const Modes = {
  DRAGGING: 'drag',
  SCALING:  'scale',
  CLICKED:  'click'
};

12
constঅবজেক্টের বৈশিষ্ট্যগুলি পরিবর্তনযোগ্য করে তোলে না, এর অর্থ কেবলমাত্র ভেরিয়েবলটিকে Modesঅন্য কোনও কিছুর কাছে পুনরায় অর্পণ করা যাবে না। এটিকে আরও সম্পূর্ণ করতে, Object.freeze()পাশাপাশি ব্যবহার করুন const
rvighne

দয়া করে ব্যবহার করবেন না Object.freeze। এটি ক্লোজার কম্পাইলারকে অবজেক্টটি অন্তর্ভুক্ত করা থেকে বিরত রাখে।
জ্যাক গিফিন 13

11

আপনি ব্যবহার করেন, তাহলে দাঁড়া , আপনি পূর্ণবিকশিত enum কার্যকারিতা পেতে পারেন জন্য বিনামূল্যে ব্যবহার (ID, নাম, কাস্টম সদস্যদের দ্বারা এটি) Backbone.Collection

// enum instance members, optional
var Color = Backbone.Model.extend({
    print : function() {
        console.log("I am " + this.get("name"))
    }
});

// enum creation
var Colors = new Backbone.Collection([
    { id : 1, name : "Red", rgb : 0xFF0000},
    { id : 2, name : "Green" , rgb : 0x00FF00},
    { id : 3, name : "Blue" , rgb : 0x0000FF}
], {
    model : Color
});

// Expose members through public fields.
Colors.each(function(color) {
    Colors[color.get("name")] = color;
});

// using
Colors.Red.print()

8

আপনার উত্তরগুলি অনেক জটিল

var buildSet = function(array) {
  var set = {};
  for (var i in array) {
    var item = array[i];
    set[item] = item;
  }
  return set;
}

var myEnum = buildSet(['RED','GREEN','BLUE']);
// myEnum.RED == 'RED' ...etc

1
@ জ্যাকগিফিন আমি সম্মত হলাম যে আপনার উত্তরটি আরও কার্যকর দয়া করে অন্যান্য উত্তর এবং বিকাশকারীদের সম্মান করুন যা আপনার চেয়ে এটি পছন্দ করে।
Xeltor

7

আমি আন্দ্রে 'ফাই' এর সমাধানটি পরিবর্তন করেছি:

  function Enum() {
    var that = this;
    for (var i in arguments) {
        that[arguments[i]] = i;
    }
    this.name = function(value) {
        for (var key in that) {
            if (that[key] == value) {
                return key;
            }
        }
    };
    this.exist = function(value) {
        return (typeof that.name(value) !== "undefined");
    };
    if (Object.freeze) {
        Object.freeze(that);
    }
  }

টেস্ট:

var Color = new Enum('RED', 'GREEN', 'BLUE');
undefined
Color.name(Color.REDs)
undefined
Color.name(Color.RED)
"RED"
Color.exist(Color.REDs)
false
Color.exist(Color.RED)
true

6

আমি এই পদ্ধতির সাথে এসেছি যা জাভাতে এনামদের পরে তৈরি করা হয়েছে। এগুলি টাইপ-নিরাপদ এবং তাই আপনি instanceofচেকগুলিও সম্পাদন করতে পারেন ।

আপনি enums সংজ্ঞায়িত করতে পারেন:

var Days = Enum.define("Days", ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]);

Daysএখন Daysএনাম বোঝায় :

Days.Monday instanceof Days; // true

Days.Friday.name(); // "Friday"
Days.Friday.ordinal(); // 4

Days.Sunday === Days.Sunday; // true
Days.Sunday === Days.Friday; // false

Days.Sunday.toString(); // "Sunday"

Days.toString() // "Days { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } "

Days.values().map(function(e) { return e.name(); }); //["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
Days.values()[4].name(); //"Friday"

Days.fromName("Thursday") === Days.Thursday // true
Days.fromName("Wednesday").name() // "Wednesday"
Days.Friday.fromName("Saturday").name() // "Saturday"

রুপায়ণ:

var Enum = (function () {
    /**
     * Function to define an enum
     * @param typeName - The name of the enum.
     * @param constants - The constants on the enum. Can be an array of strings, or an object where each key is an enum
     * constant, and the values are objects that describe attributes that can be attached to the associated constant.
     */
    function define(typeName, constants) {

        /** Check Arguments **/
        if (typeof typeName === "undefined") {
            throw new TypeError("A name is required.");
        }

        if (!(constants instanceof Array) && (Object.getPrototypeOf(constants) !== Object.prototype)) {

            throw new TypeError("The constants parameter must either be an array or an object.");

        } else if ((constants instanceof Array) && constants.length === 0) {

            throw new TypeError("Need to provide at least one constant.");

        } else if ((constants instanceof Array) && !constants.reduce(function (isString, element) {
                return isString && (typeof element === "string");
            }, true)) {

            throw new TypeError("One or more elements in the constant array is not a string.");

        } else if (Object.getPrototypeOf(constants) === Object.prototype && !Object.keys(constants).reduce(function (isObject, constant) {
                return Object.getPrototypeOf(constants[constant]) === Object.prototype;
            }, true)) {

            throw new TypeError("One or more constants do not have an associated object-value.");

        }

        var isArray = (constants instanceof Array);
        var isObject = !isArray;

        /** Private sentinel-object used to guard enum constructor so that no one else can create enum instances **/
        function __() { };

        /** Dynamically define a function with the same name as the enum we want to define. **/
        var __enum = new Function(["__"],
            "return function " + typeName + "(sentinel, name, ordinal) {" +
                "if(!(sentinel instanceof __)) {" +
                    "throw new TypeError(\"Cannot instantiate an instance of " + typeName + ".\");" +
                "}" +

                "this.__name = name;" +
                "this.__ordinal = ordinal;" +
            "}"
        )(__);

        /** Private objects used to maintain enum instances for values(), and to look up enum instances for fromName() **/
        var __values = [];
        var __dict = {};

        /** Attach values() and fromName() methods to the class itself (kind of like static methods). **/
        Object.defineProperty(__enum, "values", {
            value: function () {
                return __values;
            }
        });

        Object.defineProperty(__enum, "fromName", {
            value: function (name) {
                var __constant = __dict[name]
                if (__constant) {
                    return __constant;
                } else {
                    throw new TypeError(typeName + " does not have a constant with name " + name + ".");
                }
            }
        });

        /**
         * The following methods are available to all instances of the enum. values() and fromName() need to be
         * available to each constant, and so we will attach them on the prototype. But really, they're just
         * aliases to their counterparts on the prototype.
         */
        Object.defineProperty(__enum.prototype, "values", {
            value: __enum.values
        });

        Object.defineProperty(__enum.prototype, "fromName", {
            value: __enum.fromName
        });

        Object.defineProperty(__enum.prototype, "name", {
            value: function () {
                return this.__name;
            }
        });

        Object.defineProperty(__enum.prototype, "ordinal", {
            value: function () {
                return this.__ordinal;
            }
        });

        Object.defineProperty(__enum.prototype, "valueOf", {
            value: function () {
                return this.__name;
            }
        });

        Object.defineProperty(__enum.prototype, "toString", {
            value: function () {
                return this.__name;
            }
        });

        /**
         * If constants was an array, we can the element values directly. Otherwise, we will have to use the keys
         * from the constants object.
         */
        var _constants = constants;
        if (isObject) {
            _constants = Object.keys(constants);
        }

        /** Iterate over all constants, create an instance of our enum for each one, and attach it to the enum type **/
        _constants.forEach(function (name, ordinal) {
            // Create an instance of the enum
            var __constant = new __enum(new __(), name, ordinal);

            // If constants was an object, we want to attach the provided attributes to the instance.
            if (isObject) {
                Object.keys(constants[name]).forEach(function (attr) {
                    Object.defineProperty(__constant, attr, {
                        value: constants[name][attr]
                    });
                });
            }

            // Freeze the instance so that it cannot be modified.
            Object.freeze(__constant);

            // Attach the instance using the provided name to the enum type itself.
            Object.defineProperty(__enum, name, {
                value: __constant
            });

            // Update our private objects
            __values.push(__constant);
            __dict[name] = __constant;
        });

        /** Define a friendly toString method for the enum **/
        var string = typeName + " { " + __enum.values().map(function (c) {
                return c.name();
            }).join(", ") + " } ";

        Object.defineProperty(__enum, "toString", {
            value: function () {
                return string;
            }
        });

        /** Freeze our private objects **/
        Object.freeze(__values);
        Object.freeze(__dict);

        /** Freeze the prototype on the enum and the enum itself **/
        Object.freeze(__enum.prototype);
        Object.freeze(__enum);

        /** Return the enum **/
        return __enum;
    }

    return {
        define: define
    }

})();

এটি দেখতে দুর্দান্ত লাগছে, সম্ভবত আপনার freezeপিছনের সামঞ্জস্যের জন্য পদ্ধতির অস্তিত্ব পরীক্ষা করা উচিত ? যেমন,if (Object.freeze) { Object.freeze(values); }
এফবিবি

ভাল যুক্তি! করব!
ভিভিন পালিথ

6

আইই 8 হিমায়িত () পদ্ধতি সমর্থন করে না।
সূত্র: http://kangax.github.io/compat-table/es5/ , "অপ্রচলিত ব্রাউজারগুলি দেখান?" এ ক্লিক করুন? শীর্ষে, এবং IE8 পরীক্ষা করুন এবং সারি কর্ন চৌরাস্তা স্থির করুন।

আমার বর্তমান গেম প্রজেক্টে, আমি নীচে ব্যবহার করেছি, যেহেতু কয়েকটি গ্রাহক এখনও আই 8 ব্যবহার করেন:

var CONST_WILD_TYPES = {
    REGULAR: 'REGULAR',
    EXPANDING: 'EXPANDING',
    STICKY: 'STICKY',
    SHIFTING: 'SHIFTING'
};

আমরা এছাড়াও করতে পারে:

var CONST_WILD_TYPES = {
    REGULAR: 'RE',
    EXPANDING: 'EX',
    STICKY: 'ST',
    SHIFTING: 'SH'
};

বা এমনকি এটি:

var CONST_WILD_TYPES = {
    REGULAR: '1',
    EXPANDING: '2',
    STICKY: '3',
    SHIFTING: '4'
};

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

অ্যাসাইনমেন্ট:

var wildType = CONST_WILD_TYPES.REGULAR;

Comparision:

if (wildType === CONST_WILD_TYPES.REGULAR) {
    // do something here
}

5
var ColorEnum = {
    red: {},
    green: {},
    blue: {}
}

আপনাকে নিশ্চিত করতে হবে না যে আপনি এইভাবে বিভিন্ন এনাম মানগুলিতে সদৃশ নম্বর বরাদ্দ করেন না। একটি নতুন অবজেক্ট তাত্ক্ষণিকভাবে এবং সমস্ত এনাম মানগুলিতে নির্ধারিত হয়।


এই উত্তর আন্ডাররেটেড হয়। এটির সরলতার জন্য এটি আমার প্রিয় ধারণা ideas অনুশীলনে, আমি মনে করি আমি স্ট্রিংগুলিতে আটকে থাকব কারণ আপাতত এটি ডিবাগ করা সহজ।
ডোমিনো

হুম, শুধু নিশ্চিত হয়ে নিন যে এই কোডটি দু'বার কল হয় না ...
অ্যান্ড্রু

4

এখানে বাস্তবায়ন একটি দম্পতি বিভিন্ন উপায় আছে টাইপ করা বিষয় enums

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

function _enum(list) {       
  for (var key in list) {
    list[list[key] = list[key]] = key;
  }
  return Object.freeze(list);
}

var Color = _enum({
  Red: 0,
  Green: 5,
  Blue: 2
});

// Color → {0: "Red", 2: "Blue", 5: "Green", "Red": 0, "Green": 5, "Blue": 2}
// Color.Red → 0
// Color.Green → 5
// Color.Blue → 2
// Color[5] → Green
// Color.Blue > Color.Green → false


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

function enum() {
    var key, val = -1, list = {};
    _.reduce(_.toArray(arguments), function(result, kvp) {    
        kvp = kvp.split("=");
        key = _.trim(kvp[0]);
        val = _.parseInt(kvp[1]) || ++val;            
        result[result[val] = key] = val;
        return result;
    }, list);
    return Object.freeze(list);
}    

// Add enum to lodash 
_.mixin({ "enum": enum });

var Color = _.enum(
    "Red",
    "Green",
    "Blue = 5",
    "Yellow",
    "Purple = 20",
    "Gray"
);

// Color.Red → 0
// Color.Green → 1
// Color.Blue → 5
// Color.Yellow → 6
// Color.Purple → 20
// Color.Gray → 21
// Color[5] → Blue

খুব চালাক, ধন্যবাদ
ইলান

4

আমি সবেমাত্র একটি এনপিএম প্যাকেজ প্রকাশ করেছি জেন_েনাম আপনাকে জাভাস্ক্রিপ্টে এনাম ডেটা কাঠামো দ্রুত তৈরি করতে দেয়:

var genEnum = require('gen_enum');

var AppMode = genEnum('SIGN_UP, LOG_IN, FORGOT_PASSWORD');
var curMode = AppMode.LOG_IN;
console.log(curMode.isLogIn()); // output true 
console.log(curMode.isSignUp()); // output false 
console.log(curMode.isForgotPassword()); // output false 

এই ছোট্ট সরঞ্জামটির একটি দুর্দান্ত জিনিস হ'ল আধুনিক পরিবেশে (নোডেজ এবং আই 9+ ব্রাউজার সহ) প্রত্যাবর্তিত এনুম অবজেক্টটি অপরিবর্তনীয়।

আরও তথ্যের জন্য দয়া করে https://github.com/greenlaw110/enumjs দেখুন

আপডেট

আমি gen_enumপ্যাকেজটি অপ্রচলিত করে কনস্টজ প্যাকেজে ফাংশনটি একীভূত করি যা অপরিবর্তনীয় বস্তু, জেএসওএন স্ট্রিং ডিসরিয়ালাইজেশন, স্ট্রিং কনস্ট্যান্টস এবং বিটম্যাপ জেনারেশন সহ আরও বৈশিষ্ট্য সরবরাহ করে more আরও তথ্যের জন্য https://www.npmjs.com/package/constjs

শুধু বিবৃতি পরিবর্তন থেকে আপগ্রেড gen_enumকরতেconstjs

var genEnum = require('gen_enum');

প্রতি

var genEnum = require('constjs').enum;

4

সহজ সমাধান:

সৃষ্টি

var Status = Object.freeze({
    "Connecting":0,
    "Ready":1,
    "Loading":2,
    "Processing": 3
});

মান পান

console.log(Status.Ready) // 1

কী পান

console.log(Object.keys(Status)[Status.Ready]) // Ready

4

আমি একটি এনাম ক্লাস তৈরি করেছি যা ও (1) এ মান এবং নাম আনতে পারে। এটি সমস্ত নাম এবং মান সহ একটি অবজেক্ট অ্যারে তৈরি করতে পারে।

function Enum(obj) {
    // Names must be unique, Values do not.
    // Putting same values for different Names is risky for this implementation

    this._reserved = {
        _namesObj: {},
        _objArr: [],
        _namesArr: [],
        _valuesArr: [],
        _selectOptionsHTML: ""
    };

    for (k in obj) {
        if (obj.hasOwnProperty(k)) {
            this[k] = obj[k];
            this._reserved._namesObj[obj[k]] = k;
        }
    }
}
(function () {
    this.GetName = function (val) {
        if (typeof this._reserved._namesObj[val] === "undefined")
            return null;
        return this._reserved._namesObj[val];
    };

    this.GetValue = function (name) {
        if (typeof this[name] === "undefined")
            return null;
        return this[name];
    };

    this.GetObjArr = function () {
        if (this._reserved._objArr.length == 0) {
            var arr = [];
            for (k in this) {
                if (this.hasOwnProperty(k))
                    if (k != "_reserved")
                        arr.push({
                            Name: k,
                            Value: this[k]
                        });
            }
            this._reserved._objArr = arr;
        }
        return this._reserved._objArr;
    };

    this.GetNamesArr = function () {
        if (this._reserved._namesArr.length == 0) {
            var arr = [];
            for (k in this) {
                if (this.hasOwnProperty(k))
                    if (k != "_reserved")
                        arr.push(k);
            }
            this._reserved._namesArr = arr;
        }
        return this._reserved._namesArr;
    };

    this.GetValuesArr = function () {
        if (this._reserved._valuesArr.length == 0) {
            var arr = [];
            for (k in this) {
                if (this.hasOwnProperty(k))
                    if (k != "_reserved")
                        arr.push(this[k]);
            }
            this._reserved._valuesArr = arr;
        }
        return this._reserved._valuesArr;
    };

    this.GetSelectOptionsHTML = function () {
        if (this._reserved._selectOptionsHTML.length == 0) {
            var html = "";
            for (k in this) {
                if (this.hasOwnProperty(k))
                    if (k != "_reserved")
                        html += "<option value='" + this[k] + "'>" + k + "</option>";
            }
            this._reserved._selectOptionsHTML = html;
        }
        return this._reserved._selectOptionsHTML;
    };
}).call(Enum.prototype);

আপনি এটিকে এভাবে শুরু করতে পারেন:

var enum1 = new Enum({
    item1: 0,
    item2: 1,
    item3: 2
});

একটি মান আনতে (সি # তে এনামসের মতো):

var val2 = enum1.item2;

একটি মানের জন্য একটি নাম আনার জন্য (বিভিন্ন নামের জন্য একই মান রাখার ক্ষেত্রে দ্ব্যর্থহীন হতে পারে):

var name1 = enum1.GetName(0);  // "item1"

একটি বস্তুর প্রতিটি নাম এবং মান সহ একটি অ্যারে পেতে:

var arr = enum1.GetObjArr();

উত্পন্ন হবে:

[{ Name: "item1", Value: 0}, { ... }, ... ]

আপনি সহজেই এইচটিএমএল নির্বাচন বিকল্পগুলি পেতে পারেন:

var html = enum1.GetSelectOptionsHTML();

যা ধারণ করে:

"<option value='0'>item1</option>..."

4

যদিও শুধুমাত্র স্ট্যাটিক পদ্ধতি (এবং স্ট্যাটিক বৈশিষ্ট্য) (দেখুন ES2015 সমর্থিত হয় এখানে পাশাপাশি, §15.2.2.2), অদ্ভুতভাবে আপনি হট্টগোল সঙ্গে নিচে সাথে ব্যবহার করতে পারেন es2015প্রিসেট:

class CellState {
    v: string;
    constructor(v: string) {
        this.v = v;
        Object.freeze(this);
    }
    static EMPTY       = new CellState('e');
    static OCCUPIED    = new CellState('o');
    static HIGHLIGHTED = new CellState('h');
    static values      = function(): Array<CellState> {
        const rv = [];
        rv.push(CellState.EMPTY);
        rv.push(CellState.OCCUPIED);
        rv.push(CellState.HIGHLIGHTED);
        return rv;
    }
}
Object.freeze(CellState);

আমি এটি মডিউল জুড়ে (যেমন CellStateঅন্য মডিউল থেকে এনাম আমদানি করা) এবং ওয়েবপ্যাক ব্যবহার করে কোনও মডিউল আমদানি করার সময়ও প্রত্যাশিতভাবে কাজ করে দেখলাম।

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

হালনাগাদ

উপরের কোডটির একটি ঘাটতি রয়েছে যে এটি কোনওরকম অতিরিক্ত ধরণের বস্তু তৈরি করতে দেয় CellState(যদিও কোনওটি CellStateহিমায়িত হওয়ার কারণে স্থির ক্ষেত্রগুলিতে কোনও তাদের নির্ধারণ করতে পারে না )। তবুও, নীচে আরও পরিশ্রুত কোড নিম্নলিখিত সুবিধা দেয়:

  1. আর কোনও ধরণের বস্তু CellStateতৈরি হতে পারে না
  2. আপনি গ্যারান্টিযুক্ত যে কোনও দুটি এনাম উদাহরণ একই কোড বরাদ্দ করা হয়নি
  3. স্ট্রিং প্রতিনিধিত্ব থেকে এনামকে ফিরে পেতে ইউটিলিটি পদ্ধতি
  4. valuesফাংশন যা রিটার্ন enum সমস্ত উদাহরণ সর্বোপরি, ম্যানুয়াল (এবং ত্রুটি-প্রবণ) ভাবে ফেরত মান তৈরি করতে নেই।

    'use strict';
    
    class Status {
    
    constructor(code, displayName = code) {
        if (Status.INSTANCES.has(code))
            throw new Error(`duplicate code value: [${code}]`);
        if (!Status.canCreateMoreInstances)
            throw new Error(`attempt to call constructor(${code}`+
           `, ${displayName}) after all static instances have been created`);
        this.code        = code;
        this.displayName = displayName;
        Object.freeze(this);
        Status.INSTANCES.set(this.code, this);
    }
    
    toString() {
        return `[code: ${this.code}, displayName: ${this.displayName}]`;
    }
    static INSTANCES   = new Map();
    static canCreateMoreInstances      = true;
    
    // the values:
    static ARCHIVED    = new Status('Archived');
    static OBSERVED    = new Status('Observed');
    static SCHEDULED   = new Status('Scheduled');
    static UNOBSERVED  = new Status('Unobserved');
    static UNTRIGGERED = new Status('Untriggered');
    
    static values      = function() {
        return Array.from(Status.INSTANCES.values());
    }
    
    static fromCode(code) {
        if (!Status.INSTANCES.has(code))
            throw new Error(`unknown code: ${code}`);
        else
            return Status.INSTANCES.get(code);
    }
    }
    
    Status.canCreateMoreInstances = false;
    Object.freeze(Status);
    exports.Status = Status;

ভাল উদাহরণ :-)
আশরাফ.শাক 786

4

এস way উপায়, (পুনরাবৃত্তকারী, স্থির), ব্যবহার:

const ThreeWiseMen = new Enum('Melchior', 'Caspar', 'Balthazar')

for (let name of ThreeWiseMen)
    console.log(name)


// with a given key
let key = ThreeWiseMen.Melchior

console.log(key in ThreeWiseMen) // true (string conversion, also true: 'Melchior' in ThreeWiseMen)

for (let entry from key.enum)
     console.log(entry)


// prevent alteration (throws TypeError in strict mode)
ThreeWiseMen.Me = 'Me too!'
ThreeWiseMen.Melchior.name = 'Foo'

কোড:

class EnumKey {

    constructor(props) { Object.freeze(Object.assign(this, props)) }

    toString() { return this.name }

}

export class Enum {

    constructor(...keys) {

        for (let [index, key] of keys.entries()) {

            Object.defineProperty(this, key, {

                value: new EnumKey({ name:key, index, enum:this }),
                enumerable: true,

            })

        }

        Object.freeze(this)

    }

    *[Symbol.iterator]() {

        for (let key of Object.keys(this))
            yield this[key]

    }

    toString() { return [...this].join(', ') }

}

4

টাইপস্ক্রিপ্ট এটি enumজাভাস্ক্রিপ্টে অনুবাদ করে:

var makeEnum = function(obj) {
    obj[ obj['Active'] = 1 ] = 'Active';
    obj[ obj['Closed'] = 2 ] = 'Closed';
    obj[ obj['Deleted'] = 3 ] = 'Deleted';
}

এখন:

makeEnum( NewObj = {} )
// => {1: "Active", 2: "Closed", 3: "Deleted", Active: 1, Closed: 2, Deleted: 3}

প্রথমে আমি বিভ্রান্ত হয়েছিলাম কেন obj[1]ফিরে আসে 'Active', তবে তারপরে বুঝতে পেরেছিলাম যে এর মৃত সহজ - অ্যাসাইনমেন্ট অপারেটরটি মূল্য নির্ধারণ করে এবং তারপরে এটি প্রদান করে:

obj['foo'] = 1
// => 1

4

আপনি এরকম কিছু করতে পারেন

    var Enum = (function(foo) {

    var EnumItem = function(item){
        if(typeof item == "string"){
            this.name = item;
        } else {
            this.name = item.name;
        }
    }
    EnumItem.prototype = new String("DEFAULT");
    EnumItem.prototype.toString = function(){
        return this.name;
    }
    EnumItem.prototype.equals = function(item){
        if(typeof item == "string"){
            return this.name == item;
        } else {
            return this == item && this.name == item.name;
        }
    }

    function Enum() {
        this.add.apply(this, arguments);
        Object.freeze(this);
    }
    Enum.prototype.add = function() {
        for (var i in arguments) {
            var enumItem = new EnumItem(arguments[i]);
            this[enumItem.name] = enumItem;
        }
    };
    Enum.prototype.toList = function() {
        return Object.keys(this);
    };
    foo.Enum = Enum;
    return Enum;
})(this);
var STATUS = new Enum("CLOSED","PENDING", { name : "CONFIRMED", ackd : true });
var STATE = new Enum("CLOSED","PENDING","CONFIRMED",{ name : "STARTED"},{ name : "PROCESSING"});

যেমনটি এই গ্রন্থাগারে সংজ্ঞায়িত করা হয়েছে। https://github.com/webmodule/foo/blob/master/foo.js#L217

সম্পূর্ণ উদাহরণ https://gist.github.com/lnt/bb13a2fd63cdb8bce85fd62965a20026


3

একটি দ্রুত এবং সহজ উপায় হ'ল:

var Colors = function(){
return {
    'WHITE':0,
    'BLACK':1,
    'RED':2,
    'GREEN':3
    }
}();

console.log(Colors.WHITE)  //this prints out "0"

6
ফাংশনটি অপ্রয়োজনীয় এবং আপনাকে ওপি পোস্টের মতো সঠিক ফলাফল দেয়।
সিলডোরথ

3

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

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

ফাইল: enums.js

_ = require('underscore');

var _Enum = function () {

   var keys = _.map(arguments, function (value) {
      return value;
   });
   var self = {
      keys: keys
   };
   for (var i = 0; i < arguments.length; i++) {
      self[keys[i]] = i;
   }
   return self;
};

var fileFormatEnum = Object.freeze(_Enum('CSV', 'TSV'));
var encodingEnum = Object.freeze(_Enum('UTF8', 'SHIFT_JIS'));

exports.fileFormatEnum = fileFormatEnum;
exports.encodingEnum = encodingEnum;

এবং এটি আপনাকে কী দেয় তা চিত্রিত করার জন্য একটি পরীক্ষা:

ফাইল: enumsSpec.js

var chai = require("chai"),
    assert = chai.assert,
    expect = chai.expect,
    should = chai.should(),
    enums = require('./enums'),
    _ = require('underscore');


describe('enums', function () {

    describe('fileFormatEnum', function () {
        it('should return expected fileFormat enum declarations', function () {
            var fileFormatEnum = enums.fileFormatEnum;
            should.exist(fileFormatEnum);
            assert('{"keys":["CSV","TSV"],"CSV":0,"TSV":1}' === JSON.stringify(fileFormatEnum), 'Unexpected format');
            assert('["CSV","TSV"]' === JSON.stringify(fileFormatEnum.keys), 'Unexpected keys format');
        });
    });

    describe('encodingEnum', function () {
        it('should return expected encoding enum declarations', function () {
            var encodingEnum = enums.encodingEnum;
            should.exist(encodingEnum);
            assert('{"keys":["UTF8","SHIFT_JIS"],"UTF8":0,"SHIFT_JIS":1}' === JSON.stringify(encodingEnum), 'Unexpected format');
            assert('["UTF8","SHIFT_JIS"]' === JSON.stringify(encodingEnum.keys), 'Unexpected keys format');
        });
    });

});

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

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


5
আপনি কি কেবল "কারখানা, আন্ডারস্কোর বা অভিনব কোনও কিছু নয়, কেবল এনাম চান, এমন নৈমিত্তিক ব্যবহারকারী হিসাবে এটি কীভাবে করা যায় তা দিয়ে এখানে একটি উত্তর পোস্ট করতে পারেন?
গ্রিনআসজেড

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

3

এটি ব্যবহার করা সহজ, আমি মনে করি। https://stackoverflow.com/a/32245370/4365315

var A = {a:11, b:22}, 
enumA = new TypeHelper(A);

if(enumA.Value === A.b || enumA.Key === "a"){ 
... 
}

var keys = enumA.getAsList();//[object, object]

//set
enumA.setType(22, false);//setType(val, isKey)

enumA.setType("a", true);

enumA.setTypeByIndex(1);

হালনাগাদ:

আমার সহায়ক কোড ( TypeHelper) রয়েছে।

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