У меня есть перечисление:
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()?
Я пробовал: `export enum Language {enUS = 1, zhHant = 2}; const LanguageMap = новая карта<номер, Язык>(Object.entries(Language)); const mapLanguage = (languageCode = 1) => { return LanguageMap.get(languageCode) || нулевой; }; ` Однако сбивает с толку то, что по какой-то странной причине он повторяется 4 раза, что в 2 раза превышает количество перечислений.
• Ваша функция mapLanguage
является псевдокодом и синтаксически недействительна; пожалуйста, либо отредактируйте , чтобы исправить это, либо удалите, чтобы мы не отвлекались на это. • Числовое перечисление уже имеет обратные сопоставления , поэтому вы можете написать LanguageEnum[1]
, чтобы получить "enUS"
, как показано в этой ссылке на игровую площадку. Соответствует ли это вашим потребностям? Если да, то я мог бы написать ответ (или найти подходящую дублирующую цель); если нет, то что мне не хватает?
Перечисления в машинописном языке сложны, но по сути они создают простой объект JavaScript. Если у вас есть числовые значения вместо, например, строковых значений, объект будет иметь как ключи, так и значения в качестве ключей, поэтому у вас есть как Language['enUS'] === 1
, так и Language[1] === 'enUS'
и так далее.
Нет, потому что языковой код (значения) является случайным, а не упорядоченным.
Если вместо этого вы сделаете это: enum Language { enUS = '1', zhHant = '2' }
, значения будут строками, что приведет к машинописному написанию, а не к обратному сопоставлению. Это глупо, но так оно и работает
«Нет, потому что языковой код (значения) является случайным, а не упорядоченным» <- кому это отвечает? Если это я, вы действительно пробовали это? Обратные отображения все еще существуют. Вы могли бы написать enum Foo {A=100}
, и тогда Foo[100]
будет "A"
. Пожалуйста, прочитайте документацию по обратным сопоставлениям и убедитесь, что вы понимаете, что это такое, прежде чем отклонять его.
Извините, похоже, правильный ответ — Foo[100], спасибо.
Таким образом, функция будет просто `const mapLanguage = (languageCode = 1): Language | null => { return Language[languageCode] || нулевой; }; `
Вам не нужна функция, просто используйте индекс. Зачем вообще беспокоиться о null
? Я имею в виду, не стесняйтесь делать это, но нет необходимости заключать поиск в функцию, не так ли? В любом случае, если вы согласны, что обратное отображение соответствует вашим потребностям, я напишу ответ или найду подходящую цель для обмана, когда у меня будет такая возможность. Если нет, дайте мне знать в ближайшее время, пожалуйста. Спасибо!
Числовые перечисления в 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
могут выполняться быстрее, чем эквивалентные операции с объектами. Но единственный способ узнать это — запустить несколько тестов, а затем думать об изменении реализации только в том случае, если вы столкнетесь с узким местом в производительности. Если поиск объектов выполняется слишком медленно для вашего варианта использования, у вас, вероятно, есть много других проблем.
создайте
map
и используйтеmap.get()
, как вы сказали