如何从枚举中获取随机项?
enum Colors {
Red, Green, Blue
}
function getRandomColor(): Color {
// return a random Color (Red, Green, Blue) here
}
Run Code Online (Sandbox Code Playgroud)
sar*_*ink 12
上面的大部分答案都是返回枚举键,但我们真的不关心枚举值吗?
如果您使用 lodash,这实际上很简单:
_.sample(Object.values(myEnum)) as MyEnum
Run Code Online (Sandbox Code Playgroud)
不幸的是,强制转换是必要的,因为这会返回any. :(
如果您不使用 lodash,或者您希望将其作为自己的函数,我们仍然可以通过将@Steven Spungin 的答案修改为如下所示来获得类型安全的随机枚举:
function randomEnum<T>(anEnum: T): T[keyof T] {
const enumValues = (Object.values(anEnum) as unknown) as T[keyof T][];
const randomIndex = Math.floor(Math.random() * enumValues.length);
return enumValues[randomIndex];
}
Run Code Online (Sandbox Code Playgroud)
在从其他解决方案和关键字中获得很多启发之后keyof,这是一个返回类型安全随机枚举的通用方法。
function randomEnum<T>(anEnum: T): T[keyof T] {
const enumValues = Object.keys(anEnum)
.map(n => Number.parseInt(n))
.filter(n => !Number.isNaN(n)) as unknown as T[keyof T][]
const randomIndex = Math.floor(Math.random() * enumValues.length)
const randomEnumValue = enumValues[randomIndex]
return randomEnumValue;
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
interface MyEnum {X, Y, Z}
const myRandomValue = randomEnum(MyEnum)
Run Code Online (Sandbox Code Playgroud)
myRandomValue将为类型MyEnum。
怎么样,使用es2017 中的Object.values(IE 不支持,其他浏览器支持更新):
function randEnumValue<T>(enumObj: T): T[keyof T] {
const enumValues = Object.values(enumObj);
const index = Math.floor(Math.random() * enumValues.length);
return enumValues[index];
}
Run Code Online (Sandbox Code Playgroud)
所以没有答案对我有用,我最终这样做:
具有以下枚举
export enum Jokenpo {
PAPER = 'PAPER',
ROCK = 'ROCK',
SCISSOR = 'SCISSOR',
}
Run Code Online (Sandbox Code Playgroud)
随机选择
const index= Math.floor(Math.random() * Object.keys(Jokenpo).length);
const value= Object.values(Jokenpo)[index];
return Jokenpo[value];
Run Code Online (Sandbox Code Playgroud)
我只是从枚举中获取一个随机值并使用它来转换为真实值。
| 归档时间: |
|
| 查看次数: |
4486 次 |
| 最近记录: |