Как лучше всего получить значение из перечисления в TypeScript

У меня есть перечисление:

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()?

создайте map и используйте map.get(), как вы сказали

Chris G 17.04.2024 20:15

Я пробовал: `export enum Language {enUS = 1, zhHant = 2}; const LanguageMap = новая карта<номер, Язык>(Object.entries(Language)); const mapLanguage = (languageCode = 1) => { return LanguageMap.get(languageCode) || нулевой; }; ` Однако сбивает с толку то, что по какой-то странной причине он повторяется 4 раза, что в 2 раза превышает количество перечислений.

cafe123 17.04.2024 20:16

• Ваша функция mapLanguage является псевдокодом и синтаксически недействительна; пожалуйста, либо отредактируйте , чтобы исправить это, либо удалите, чтобы мы не отвлекались на это. • Числовое перечисление уже имеет обратные сопоставления , поэтому вы можете написать LanguageEnum[1], чтобы получить "enUS", как показано в этой ссылке на игровую площадку. Соответствует ли это вашим потребностям? Если да, то я мог бы написать ответ (или найти подходящую дублирующую цель); если нет, то что мне не хватает?

jcalz 17.04.2024 20:18

Перечисления в машинописном языке сложны, но по сути они создают простой объект JavaScript. Если у вас есть числовые значения вместо, например, строковых значений, объект будет иметь как ключи, так и значения в качестве ключей, поэтому у вас есть как Language['enUS'] === 1, так и Language[1] === 'enUS' и так далее.

ShamPooSham 17.04.2024 20:18

Нет, потому что языковой код (значения) является случайным, а не упорядоченным.

cafe123 17.04.2024 20:20

Если вместо этого вы сделаете это: enum Language { enUS = '1', zhHant = '2' }, значения будут строками, что приведет к машинописному написанию, а не к обратному сопоставлению. Это глупо, но так оно и работает

ShamPooSham 17.04.2024 20:20

«Нет, потому что языковой код (значения) является случайным, а не упорядоченным» <- кому это отвечает? Если это я, вы действительно пробовали это? Обратные отображения все еще существуют. Вы могли бы написать enum Foo {A=100}, и тогда Foo[100] будет "A". Пожалуйста, прочитайте документацию по обратным сопоставлениям и убедитесь, что вы понимаете, что это такое, прежде чем отклонять его.

jcalz 17.04.2024 20:21

Извините, похоже, правильный ответ — Foo[100], спасибо.

cafe123 17.04.2024 20:23

Таким образом, функция будет просто `const mapLanguage = (languageCode = 1): Language | null => { return Language[languageCode] || нулевой; }; `

cafe123 17.04.2024 20:23

Вам не нужна функция, просто используйте индекс. Зачем вообще беспокоиться о null? Я имею в виду, не стесняйтесь делать это, но нет необходимости заключать поиск в функцию, не так ли? В любом случае, если вы согласны, что обратное отображение соответствует вашим потребностям, я напишу ответ или найду подходящую цель для обмана, когда у меня будет такая возможность. Если нет, дайте мне знать в ближайшее время, пожалуйста. Спасибо!

jcalz 17.04.2024 20:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
10
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Числовые перечисления в TypeScript автоматически снабжены обратными сопоставлениями. То есть перечисление также будет содержать числовые ключи, которые относятся к строковым значениям. Все, что вам нужно сделать, чтобы получить ключ из значения, — это индексировать объект перечисления со значением. Обратите внимание, что ваше перечисление Language компилируется примерно так:

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

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

Итак, чтобы получить "enUS" от 1, вам нужно всего лишь написать Language[1]:

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

Это означает, что вам действительно не нужно писать функцию для этого, поскольку по сути это просто операция индексации.

Что касается производительности, неясно, как ее лучше всего измерить, поэтому я не буду пытаться на этот вопрос ответить. В зависимости от вариантов использования операции Map могут выполняться быстрее, чем эквивалентные операции с объектами. Но единственный способ узнать это — запустить несколько тестов, а затем думать об изменении реализации только в том случае, если вы столкнетесь с узким местом в производительности. Если поиск объектов выполняется слишком медленно для вашего варианта использования, у вас, вероятно, есть много других проблем.

Ссылка на код детской площадки

Другие вопросы по теме