Можно ли сохранить пользовательский объект в Map()?

129
18

У меня есть ответ по типу:

interface IDictionaryKey {
text: string;
}

let data = response<IDictionaryKey>[];

Можно ли установить полный ответ на new Map()?

Что-то вроде того:

dictionary = new Map<IDictionaryKey[]>();

спросил(а) 2019-05-06T20:34:00+03:00 2 года, 4 месяца назад
1
Решение
79

Вы можете установить полный ответ на new Map(). Я вижу следующие варианты:

Полный массив ответов перейдет к одному элементу Map. Это имеет смысл, если вы собираетесь получать дополнительные ответы типа IDictionaryKey[] и сохранять их в dictionary. (Как reponse2, response3 и так далее).

let data: IDictionaryKey[] = response<IDictionaryKey>[];
let dictionary = new Map<string, IDictionaryKey[]>();
dictionary.set("response1", data);
// Now you can retriev first response by
let response1 = dictionary.get("response1");

Каждый элемент массива ответов перейдет к одному элементу Map. Здесь одна проблема. Интерфейс IDictionaryKey содержит только одно свойство text. Чтобы Map был полезен, лучше иметь как минимум два свойства, одно будет ключевым, другое - значением. Но IDictionaryKey можно использовать в Map даже с одним свойством.

let data: IDictionaryKey[] = response<IDictionaryKey>[];
let dictionary = new Map<IDictionaryKey, any>();
data.forEach(d => dictionary.set(d, "" as any));
// As a result, Map will have only keys. All values will be empty strings
// Now you can retrive element by
let elem: IDictionaryKey = {text: "something"};
let dictionaryElement = dictionary.get(elem);
// dictionaryElement will always be either "" or undefined

Конечно, вы можете манипулировать массивом data чтобы добавить его в Map другим способом. Например

let dictionary = new Map<string, IDictionaryKey>();
data.forEach(d => dictionary.set(d.text, d));
// And get each element from Map only by text property
let dictionaryElement: IDictionaryKey = dictionary.get("MyText");

И последний совет. Map имеет конструктор, поэтому можно заполнить Map во время построения.

let dictionary = new Map<IDictionaryKey, any>(data.map<[IDictionaryKey, any]>(d => [d, "" as any]));

ответил(а) 2019-05-07T02:02:00+03:00 2 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема