Поскольку мне нужна карта, где ключ связан не только со значением, но и с некоторыми метаданными, такими как 'weight' или 'timeToLive', я пытался использовать структуру на основе карты в форме, подобной class MdaMap<M, K, V> extends Map<K, AugmValue<V, M>>
.Как ответили в Реализация карты ES6, дополненной метаданными в Typescript , это не очень хороший подход.Второй вариант - это объект-обертка вокруг карты, но он выглядит как meh.Поэтому я подумал о третьем варианте: переопределении Map.
Поэтому я создаю класс, который должен содержать записи 3-х видов: ключи, значения и метаданные.
class MdaMap<K, V, M> {
K для ключей, V для значений и M для метаданных.Теперь вопрос: какая структура данных будет лучшей.Я вижу следующие решения:
массив кортежей:
private store: [K, V, M][];
массив объектов:
private store: {key: K, value: V, metadata: M}[]
3 массива:
private keys: K[];
private values: V[];
private metadata: M[];
Решения 1. и 2. требуют циклического перемещения по массиву до тех пор, пока не будет найден данный ключ.Разница, по-видимому, заключается в удобстве доступа к ключу, значению или метаданным - в противном случае я подозреваю, что кортеж проще для ресурсов.
Что касается 3. Мне, конечно, нужно помнить об установке и удалении элемента во всех трех массивах, и это не проблема.Но мне интересно, возможно ли, что если MdaMap будет в общем объекте, массив keys
, values
и metadata
мог бы десинхронизироваться, если, скажем, в то же время есть вызов к set(k: K, v: V, m: M): void
и к del(k: K): void
?
Какой, по вашему мнению, лучший подход и почему?