我在
下面标记了枚举enum PermissionEnum {
SU = 1 << 0, // 1
Administrator = 1 << 1, // 2
User = 1 << 2 // 4
}
对于给定值6,我该如何获得
string [] - &gt; [&#39;管理员&#39;,&#39;用户&#39;]
数字[] - &gt; [2,4]
答案 0 :(得分:2)
这应该有效:
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]);
}
}
答案 1 :(得分:1)
您可以在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
。