Повторная реализация карты в Typescript - PullRequest
0 голосов
/ 02 октября 2018

Поскольку мне нужна карта, где ключ связан не только со значением, но и с некоторыми метаданными, такими как '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 для метаданных.Теперь вопрос: какая структура данных будет лучшей.Я вижу следующие решения:

  1. массив кортежей:

    private store: [K, V, M][];
    
  2. массив объектов:

    private store: {key: K, value: V, metadata: M}[]
    
  3. 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?

Какой, по вашему мнению, лучший подход и почему?

1 Ответ

0 голосов
/ 02 октября 2018

Вам не нужно повторно внедрять Map;просто используйте его с кортежем в качестве содержимого:

private store: Map<K, [V, M]>;

Теперь вы все еще можете индексировать карту с помощью своего ключа, а затем вы удаляете либо значение, либо метаданные из того, что получаете обратно.

private store = new Map<string, [number, string]>();
store.set('duck', [1.50, 'yellow']);
store.set('firetruck', [8.49, 'red']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...