অ্যারে অবজেক্ট টাইপস্ক্রিপ্ট এনাম


99

আমি একটি এনাম এইভাবে সংজ্ঞায়িত করেছি:

export enum GoalProgressMeasurements {
    Percentage = 1,
    Numeric_Target = 2,
    Completed_Tasks = 3,
    Average_Milestone_Progress = 4,
    Not_Measured = 5
}

তবে, আমি চাই এটি নীচের মত আমাদের API থেকে একটি অবজেক্ট অ্যারে / তালিকা হিসাবে প্রতিনিধিত্ব করা:

[{id: 1, name: 'Percentage'}, 
 {id: 2, name: 'Numeric Target'},
 {id: 3, name: 'Completed Tasks'},
 {id: 4, name: 'Average Milestone Progress'},
 {id: 5, name: 'Not Measured'}]

এটি করার কি সহজ এবং দেশীয় উপায় আছে বা আমার কি এমন একটি ফাংশন তৈরি করতে হবে যা এনামকে একটি ইনট এবং স্ট্রিং উভয়কে কাস্ট করে, এবং অবজেক্টগুলিকে একটি অ্যারেতে তৈরি করে?


এনামগুলি হ'ল আসল বস্তু যা রানটাইমের সময় বিদ্যমান। সুতরাং GoalProgressMeasurements[GoalProgressMeasurements.Completed_Tasks]এনামের নাম পেতে আপনি ম্যাপিংকে এরকম কিছু করে উল্টো করতে সক্ষম হন । আমি জানি না যে এটি সাহায্য করে কিনা।
দিউল্লি

আপনি কি "আমাদের এপিআই থেকে" আরও ভাল বর্ণনা দিতে পারেন, সম্ভবত ব্যবহারের একটি উদাহরণ দিতে পারেন
gilamran

উত্তর:


46

একটি জটিল বিষয় হ'ল টাইপস্ক্রিপ্ট নির্গত বস্তুর এনামকে 'ডাবল' করবে, সুতরাং এটি কী এবং মান উভয়ই অ্যাক্সেস করা যায়।

enum MyEnum {
    Part1 = 0,
    Part2 = 1
}

হিসাবে নির্গত হবে

{
   Part1: 0,
   Part2: 1,
   0: 'Part1',
   1: 'Part2'
}

সুতরাং আপনাকে ম্যাপিংয়ের আগে প্রথমে অবজেক্টটি ফিল্টার করা উচিত। সুতরাং @ ডিউল্লির সমাধানটির সঠিক উত্তর রয়েছে। আমার বাস্তবায়ন এখানে:

// Helper
const StringIsNumber = value => isNaN(Number(value)) === false;

// Turn enum into array
function ToArray(enumme) {
    return Object.keys(enumme)
        .filter(StringIsNumber)
        .map(key => enumme[key]);
}

এটি এর মতো ব্যবহার করুন:

export enum GoalProgressMeasurements {
    Percentage,
    Numeric_Target,
    Completed_Tasks,
    Average_Milestone_Progress,
    Not_Measured
}

console.log(ToArray(GoalProgressMeasurements));

4
মিমি যদি তখন enum MyEnum { Part1 = 0, Part2 = 1 }পরিণত হয় { Part1: 0, Part2: 1, 0: 'Part1', 1: 'Part2' }তবে আপনি যখন console.log(Object.values(MyEnum))কেবল 0,1 টি মুদ্রণ করেন কেন ?
জুয়ান জোসে রামেরেজ

@ জুয়ান জোস রামরেজ আপনি কোথায় দেখছেন? আমার জন্য Object.values(MyEnum)মূল্যায়ন["Part1", "Part2", 0, 1]
ব্যবহারকারীর 8363

আমি শুধু console.log(Object.values(MyEnum))আমার উপাদান মুদ্রিত । আমি কৌণিক ব্যবহার করছি, এটি সম্পর্কিত কিনা তা নিশ্চিত নই। আমি টাইপস্ক্রিপ্ট
হুয়ান জোসে

আচরণটি কি বিভিন্ন টিএস সংস্করণের মাধ্যমে পরিবর্তিত হতে পারে?
জুয়ান জোসে রামারেজ

4
আমি দস্তাবেজগুলি typcriptlang.org.org / ডকস / হ্যান্ডবুক / রিলিজ- নোট /… পরীক্ষা করে দেখছি এবং মনে হচ্ছে স্ট্রিং এনামগুলির একটি আলাদা আচরণ রয়েছে। তারা মোটেই উত্পন্ন বিপরীত ম্যাপিং পায় না। আমার কোডে, আমি উদাহরণস্বরূপ স্ট্রিং নয়, একটি স্ট্রিং এনুম ব্যবহার করছিলাম।
জুয়ান জোসে রামেরেজ

39

আপনি যদি ES6 ব্যবহার করছেন

এটি আপনাকে প্রদত্ত এনামের মান অ্যারে দেবে ।

enum Colors {
  WHITE = 0,
  BLACK = 1,
  BLUE = 3
}

const colorValueArray = Object.values(Colors); //[ 'WHITE', 'BLACK', 'BLUE', 0, 1, 3 ]

আপনি colorValueArrayএই মত পাবেন [ 'WHITE', 'BLACK', 'BLUE', 0, 1, 3 ]। সমস্ত কীগুলি অ্যারের প্রথমার্ধে এবং দ্বিতীয়ার্ধের সমস্ত মান থাকবে।


8
মনে রাখবেন যে এটির সদৃশ হবে। প্রতিটি উপাদানটির জন্য স্ট্রিংয়ের মান এবং সংখ্যাসূচক মান, এটি এমন এক প্রকার (string | YourEnumType)[]যা আপনি প্রতিটি ক্ষেত্রে পছন্দ করতে পারেন না।
খ্রিস্টান আইভিসেভিচ

এটি কি নিশ্চিত যে প্রথমার্ধটি কী হবে এবং দ্বিতীয়ার্ধের মান হবে? কোন রেফারেন্স?
নীকি

36

এনামগুলি হ'ল আসল বস্তু যা রানটাইমের সময় বিদ্যমান। সুতরাং আপনি ম্যাপিং এর বিপরীতে সক্ষম এমন কিছু করছেন:

let value = GoalProgressMeasurements.Not_Measured;
console.log(GoalProgressMeasurements[value]);
// => Not_Measured

এর ভিত্তিতে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

export enum GoalProgressMeasurements {
    Percentage = 1,
    Numeric_Target = 2,
    Completed_Tasks = 3,
    Average_Milestone_Progress = 4,
    Not_Measured = 5
}

let map: {id: number; name: string}[] = [];

for(var n in GoalProgressMeasurements) {
    if (typeof GoalProgressMeasurements[n] === 'number') {
        map.push({id: <any>GoalProgressMeasurements[n], name: n});
    }
}

console.log(map);

তথ্যসূত্র: https://www.typescriptlang.org/docs/handbook/enums.html


4
আপনাকে ডিফল্টগুলি লেখার দরকার নেই = 2যতক্ষণ না = 5- পরে = 1যে কোনও কিছুই স্বয়ংক্রিয়ভাবে +1 হয়।
sebilasse

8
হতে পারে আপনার প্রয়োজন নেই, তবে এটি আরও প্রকাশিত। যা এটি আরও ভাল আইএমএইচও করে তোলে।
সাব্লাইমসিয়েম

4
কেবল একটি নোট এটি স্ট্রিংয়ের মান এনামগুলিতে কাজ করে না
বাশার আলি লবাদী

21

সহজ সমাধান। আপনার এনামকে অবজেক্টগুলির একটি অ্যারে রূপান্তর করতে আপনি নীচের ফাংশনটি ব্যবহার করতে পারেন।

 buildGoalProgressMeasurementsArray(): Object[] {

    return Object.keys(GoalProgressMeasurements)
              .map(key => ({ id: GoalProgressMeasurements[key], name: key }))
 }

আপনার যদি সেই স্ট্রিপটি আন্ডারস্কোর বন্ধ করার প্রয়োজন হয়, আমরা নীচে রেজেক্স ব্যবহার করতে পারি:

buildGoalProgressMeasurementsArray(): Object[] {

    return Object.keys(GoalProgressMeasurements)
              .map(key => ({ id: GoalProgressMeasurements[key], name: key.replace(/_/g, ' ') }))
 }

7
আপনার টাইপ নম্বরের কীগুলি ফিল্টার করা উচিত Object.keys(GoalProgressMeasurements) .filter(key => typeof GoalProgressMeasurements[key] === 'number') .map(key => ({ id: GoalProgressMeasurements[key], name: key }))
সালভাদোর রুবিও মার্টিনেজ

12

আমি ব্যবহার করি

Object.entries(GoalProgressMeasurement).filter(e => !isNaN(e[0]as any)).map(e => ({ name: e[1], id: e[0] }));

একটি সহজ 1 লাইন যা কাজ করে।

এটি 3 টি সহজ পদক্ষেপে কাজ করে
- কীগুলি ব্যবহার করে এবং মানগুলির সংমিশ্রণ লোড করে Object.entries
- অ-সংখ্যাগুলি ফিল্টার করে (যেহেতু টাইপস্ক্রিপ্ট বিপরীত অনুসন্ধানের জন্য মান উত্পন্ন করে)।
- তারপরে আমরা এটিকে আমাদের পছন্দ মতো অ্যারেতে মানচিত্র করি map


ফ্রন্ট-এন্ডের সাথে IE এর সাথে সামঞ্জস্যপূর্ণ নয় (সমর্থন করা উচিত নয় এটি দুর্দান্ত উত্তর ... তবে আমি গ্রাহকদের ধারণা)। হোপিং
বাবেল

9
class EnumHelpers {

    static getNamesAndValues<T extends number>(e: any) {
        return EnumHelpers.getNames(e).map(n => ({ name: n, value: e[n] as T }));
    }

    static getNames(e: any) {
        return EnumHelpers.getObjValues(e).filter(v => typeof v === 'string') as string[];
    }

    static getValues<T extends number>(e: any) {
        return EnumHelpers.getObjValues(e).filter(v => typeof v === 'number') as T[];
    }

    static getSelectList<T extends number, U>(e: any, stringConverter: (arg: U) => string) {
        const selectList = new Map<T, string>();
        this.getValues(e).forEach(val => selectList.set(val as T, stringConverter(val as unknown as U)));
        return selectList;
    }

    static getSelectListAsArray<T extends number, U>(e: any, stringConverter: (arg: U) => string) {
        return Array.from(this.getSelectList(e, stringConverter), value => ({ value: value[0] as T, presentation: value[1] }));
    }

    private static getObjValues(e: any): (number | string)[] {
        return Object.keys(e).map(k => e[k]);
    }
}

4
এই সাহায্যকারীদের জন্য আপনাকে ধন্যবাদ। খুব দরকারী.
ব্যবহারকারী 906573

8

এটি আপনাকে এনাম মানগুলির একটি অ্যারে দেবে:

 Object.values(myEnum);

কেন এটি শীর্ষ উত্তর নয়? যাইহোক ধন্যবাদ!
পাওলো কুইরোজ

@ পাওলো কিউইরোজ আপভোট বৃদ্ধি পেলে এটি স্বয়ংক্রিয়ভাবে উপরে যাবে। ধন্যবাদ!
গৌরব পানওয়ার

কারণ এটা ফেলে না টি দিতে ডান ফলে চেক stackoverflow.com/a/57266281/3548345
walox

4

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

const converted = Object.keys(GoalProgressMeasurements).map(key => {
        return {
            id: GoalProgressMeasurements[key],
            name: key,
        };
    });

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


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

2

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

নিম্নলিখিত ক্রিয়াকলাপগুলি মানগুলির কীগুলির সঠিক মানচিত্র দেওয়ার জন্য টাইপস্ক্রিপ্ট এনামগুলির শব্দার্থবিজ্ঞানের অনুসরণ করে। সেখান থেকে, অবজেক্টগুলির একটি অ্যারে বা কেবল কীগুলি বা কেবল মানগুলি পাওয়া তুচ্ছ।

/**
 * Converts the given enum to a map of the keys to the values.
 * @param enumeration The enum to convert to a map.
 */
function enumToMap(enumeration: any): Map<string, string | number> {
  const map = new Map<string, string | number>();
  for (let key in enumeration) {
      //TypeScript does not allow enum keys to be numeric
      if (!isNaN(Number(key))) continue;

      const val = enumeration[key] as string | number;

      //TypeScript does not allow enum value to be null or undefined
      if (val !== undefined && val !== null)
          map.set(key, val);
  }

  return map;
}

ব্যবহারের উদাহরণ:

enum Dog {
    Rover = 1,
    Lassie = "Collie",
    Fido = 3,
    Cody = "Mutt",
}

let map = enumToMap(Dog); //Map of keys to values

lets objs = Array.from(map.entries()).map(m => ({id: m[1], name: m[0]})); //Objects as asked for in OP
let entries = Array.from(map.entries()); //Array of each entry
let keys = Array.from(map.keys()); //An array of keys
let values = Array.from(map.values()); //An array of values

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


1

enum GoalProgressMeasurements {
    Percentage = 1,
    Numeric_Target = 2,
    Completed_Tasks = 3,
    Average_Milestone_Progress = 4,
    Not_Measured = 5
}
    
const array = []
    
for (const [key, value] of Object.entries(GoalProgressMeasurements)) {
    if (!Number.isNaN(Number(key))) {
        continue;
    }

    array.push({ id: value, name: key.replace('_', '') });
}

console.log(array);


দয়া করে আপনার উত্তরটি কেবলমাত্র পেস্টিং কোডের পরিবর্তে প্রসঙ্গে দিন। দেখুন এখানে আরো বিস্তারিত জানার জন্য।
gebbiszumeis

0

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

export enum GoalProgressMeasurements {
    Percentage = 1,
    Numeric_Target = 2,
    Completed_Tasks = 3,
    Average_Milestone_Progress = 4,
    Not_Measured = 5
}

export class GoalProgressMeasurement {
    constructor(public goalProgressMeasurement: GoalProgressMeasurements, public name: string) {
    }
}

export var goalProgressMeasurements: { [key: number]: GoalProgressMeasurement } = {
    1: new GoalProgressMeasurement(GoalProgressMeasurements.Percentage, "Percentage"),
    2: new GoalProgressMeasurement(GoalProgressMeasurements.Numeric_Target, "Numeric Target"),
    3: new GoalProgressMeasurement(GoalProgressMeasurements.Completed_Tasks, "Completed Tasks"),
    4: new GoalProgressMeasurement(GoalProgressMeasurements.Average_Milestone_Progress, "Average Milestone Progress"),
    5: new GoalProgressMeasurement(GoalProgressMeasurements.Not_Measured, "Not Measured"),
}

এবং আপনি এটি ব্যবহার করতে পারেন:

var gpm: GoalProgressMeasurement = goalProgressMeasurements[GoalProgressMeasurements.Percentage];
var gpmName: string = gpm.name;

var myProgressId: number = 1; // the value can come out of drop down selected value or from back-end , so you can imagine the way of using
var gpm2: GoalProgressMeasurement = goalProgressMeasurements[myProgressId];
var gpmName: string = gpm.name;

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


0

যেহেতু স্ট্রিংস মানগুলির সাথে এনামগুলি সংখ্যার মানগুলির সাথে পৃথক হয় তবে @ ব্যবহারকারী 63৩63৩ সমাধান থেকে নন নম্বরগুলি ফিল্টার করা ভাল।

আপনি এখানে এনাম থেকে মানগুলি কীভাবে স্ট্রিং, মিক্সড সংখ্যার পেতে পারেন তা এখানে রয়েছে:

    //Helper
    export const StringIsNotNumber = value => isNaN(Number(value)) === true;
    
    // Turn enum into array
    export function enumToArray(enumme) {
      return Object.keys(enumme)
       .filter(StringIsNotNumber)
       .map(key => enumme[key]);
    }


0

আমি টাইপস্ক্রিপ্ট থ্রেডে অবাক হয়েছি কেউ টাইপিং সমর্থন করে বৈধ টাইপস্ক্রিপ্ট ফাংশন দেয়নি। এখানে @ ব্যবহারকারী 83৩63৩ সমাধানের প্রকরণ:

const isStringNumber = (value: string) => isNaN(Number(value)) === false;

function enumToArray<T extends {}>(givenEnum: T) {
  return (Object.keys(givenEnum).filter(isStringNumber) as (keyof T)[]).map(
    (key) => givenEnum[key]
  );
}

-1

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

enum Enum {
   ONE,
   TWO,
   THREE,
   FOUR,
   FIVE,
   SIX,
   SEVEN
}
const keys = Object.keys(Enum); 
console.log(keys.slice(keys.length / 2));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.