-1
我检举了枚举下面打字稿标记枚举获取值
enum PermissionEnum {
SU = 1 << 0, // 1
Administrator = 1 << 1, // 2
User = 1 << 2 // 4
}
对于给定的值6,我怎样才能得到
串[] - > [ '管理员', '用户']
数[] - > [2,4]
我检举了枚举下面打字稿标记枚举获取值
enum PermissionEnum {
SU = 1 << 0, // 1
Administrator = 1 << 1, // 2
User = 1 << 2 // 4
}
对于给定的值6,我怎样才能得到
串[] - > [ '管理员', '用户']
数[] - > [2,4]
这应该工作:
let x: PermissionEnum = PermissionEnum.Administrator | PermissionEnum.User;
const permNum: number[] = [];
const permStr: string[] = [];
let i = 0;
let perm: number;
while (PermissionEnum[perm = 1 << i++]) {
if (x & perm) {
permNum.push(perm);
permStr.push(PermissionEnum[perm]);
}
}
您可以在enum
命名空间中添加一个静态函数,并使用它来执行转换。
此外,您可以使用技巧从数字中提取设置位,而不必遍历所有未设置的位:n & (~n+1)
会给出最低设置位。
enum PermissionEnum {
SU = 1 << 0, // 1
Administrator = 1 << 1, // 2
User = 1 << 2 // 4
}
namespace PermissionEnum {
export function toValues(n: PermissionEnum) {
const values: string[] = [];
while (n) {
const bit = n & (~n+1);
values.push(PermissionEnum[bit]);
n ^= bit;
}
return values;
}
}
console.log(PermissionEnum.toValues(PermissionEnum.Administrator));
console.log(PermissionEnum.toValues(PermissionEnum.Administrator + PermissionEnum.SU));
输出是:
[ 'Administrator' ]
[ 'SU', 'Administrator' ]
到数字转换将是相同的,但只是推bit
没有查找。