如何遍历enum枚举为数组元素按枚举顺序依次赋值?
实现方案
你定义的是TypeScript默认的数字枚举,编译后会同时生成正向(成员名→数值)和反向(数值→成员名)映射,我们可以先提取按枚举定义顺序排列的有效值列表,再通过遍历索引匹配赋值即可。
步骤1:提取枚举值列表
// 提取按你定义顺序排列的枚举数值列表 [0,1,2,...] 对应green/red/blue... const colourValues = Object.keys(Colours) // 过滤掉反向映射生成的数字类型key .filter(key => isNaN(Number(key))) .map(key => Colours[key as keyof typeof Colours]);
如果需要给colour赋值的是枚举名的字符串(比如'green'而非数字0),修改map逻辑即可:
const colourNames = Object.keys(Colours) .filter(key => isNaN(Number(key)));
步骤2:遍历数组按索引赋值
遍历数组时用元素索引匹配枚举列表的下标即可,以下示例加了取模逻辑,避免数组长度超过枚举长度时报错,如果你能保证数组长度小于等于枚举长度可以去掉% colourValues.length:
array.forEach((item, index) => { // 赋值枚举数值 item.colour = colourValues[index % colourValues.length]; // 如果要赋值字符串名称就用 colourNames[index % colourNames.length] });
简化方案(仅适用固定顺序的连续数字枚举)
如果你确认你的枚举永远保持当前定义顺序、且是从0开始的连续数字枚举,可以直接省略第一步的枚举列表提取,直接把索引转为枚举类型即可:
array.forEach((item, index) => { item.colour = index as Colours; });
注意:该方案强依赖枚举的定义顺序和值连续性,后续修改枚举定义(比如新增成员插在开头、调整成员顺序)会导致赋值逻辑出错,更推荐优先使用第一种方案。
内容的提问来源于stack exchange,提问作者Leviathan
相关产品推荐
相关产品推荐

