2017-03-29 18 views
4

をオブジェクトに私は列挙型は、このように定義していますは活字体列挙型の配列

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

これを行う簡単でネイティブな方法がありますか、またはenumをintとstringの両方にキャストし、配列にオブジェクトを構築する関数をビルドする必要がありますか?

+0

列挙型は、実行時に存在し、実際のオブジェクトです。ですから、あなたは次のようなやり方でマッピングを逆にすることができます: 'GoalProgressMeasurements [GoalProgressMeasurements.Completed_Tasks]'は列挙型の名前を取得します。それが役立つかどうかはわかりません。 – Diullei

+0

"APIから"より良い説明を与えることができます。使用例を挙げてください。 – gilamran

答えて

5

エンティティは、実行時に存在する実際のオブジェクトです。ですから、このような何かをやってマッピングを逆にすることができます:

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

+0

デフォルト値 '= 2'を' = 5'まで書く必要はありません。 '= 1'の後は自動的に+1になります。 – sebilasse

+0

@sebilasse完全に正しい。 –

0

簡単ソリューション

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

次のコードを使用できることに基づきます。次の関数を使用して、列挙型をオブジェクトの配列に変換できます。

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, ' ') })) 
}