我有一个enum:

export enum Language {
  enUS = 1,
  zhHant = 2
};

我想要一个可以根据传递的值有效地为我获取密钥的函数:

export enum Language {
  enUS = 1,
  zhHant = 2
};

const languageMap = new Map<number, Language>(
  Object.entries(Language).map(([key, value]) => [parseInt(key), value as Language])
);

const mapLanguage = (languageCode = 1): Language | null => {
  return languageMap.get(languageCode) || null;
};

假设这种方法用于一百万个条目,那么最有效的方法是什么?是使用Map和Map.get()吗?

推荐答案

TypScript中的数字枚举自动提供reverse mappings. 也就是说,该列举还将包含指向字符串值的数字键.要从值获取键,您所要做的就是用该值索引到enum对象中. 观察您的Language enum编译成这样的内容:

enum Language {
  enUS = 1,
  zhHant = 2
};

console.log(Language)
/* {
  "1": "enUS",
  "2": "zhHant",
  "enUS": 1,
  "zhHant": 2
}  */

因此,要从1得到"enUS",您需要做的就是写Language[1]:

console.log(Language[1]) // "enUS"

这意味着您实际上不必编写函数来做到这一点,因为它本质上只是一个索引操作.

至于performance,目前尚不清楚如何最好地衡量它,所以我不会试图回答这个问题.根据用例,Map个操作可能比等效对象操作更快.但您要知道的唯一方法是实际运行一些测试,然后只有在遇到性能瓶颈时才考虑更改实现. 如果对象查找对于您的用例来说太慢,那么您可能会遇到很多其他问题.

Playground link to code

Javascript相关问答推荐

为什么我的第二个OnClick Isloading值在TEK查询Mutations 查询中不起作用?

如何通过继承contentitable属性的元素捕捉keydown事件?

积分计算和 colored颜色 判断错误

fetch在本地设置相同来源的cookie,但部署时相同的代码不会设置cookie

网页自检测外部元素无法加载

如何粗体匹配的字母时输入搜索框使用javascript?

切换时排序对象数组,切换不起作用

html + java script!需要帮助来了解为什么我得到(无效的用户名或密码)

如何添加绘图条形图图例单击角形事件

Javascript json定制

我怎么在JS里连续加2个骰子的和呢?

JQuery Click事件不适用于动态创建的按钮

Reaction组件在本应被设置隐藏时仍显示

JavaScript不重定向配置的PATH

React:防止useContext重新渲染整个应用程序或在组件之间共享数据而不重新渲染所有组件

MongoDB中的嵌套搜索

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

在JavaScript中将Base64转换为JSON

如何在加载页面时使锚定标记成为焦点

如何按区域进行过滤并将其从结果数组中删除?