Это плохая практика для сопоставления объекта с его собственным свойством? - PullRequest
1 голос
/ 01 июля 2019

Я часто нахожу себя передающим объекты, которые имеют идентификаторы или имена, которые их идентифицируют, но также являются свойством объекта. Например:

type ExampleItemName = string;
interface ExampleItem {
  name: ExampleItemName ;
  value: number;
}

Мне также часто нужно создавать списки этих предметов, и я считаю, что удобно иметь доступ к предметам по их name s. Наиболее логичной структурой данных, которую я вижу для этого, является Map, то есть:

type ExampleItemList = Map<ExampleItemName, ExampleItem>;

Это удобно и удобно, так как я могу получить доступ к любому элементу по name с помощью Map.get, но я также могу легко перебирать весь список, используя for...of.

Однако мне кажется, что это неправильно, потому что информация name дублируется - она ​​присутствует как в ключе, так и в значении карты. Если name из ExampleItem изменяется, соответствующий ключ на карте не меняется, поэтому он чувствует себя хрупким.

Это плохая практика? Если да, то какой лучший способ добиться нужной мне функциональности?

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Это не плохая практика как таковая, но есть несколько условий, которые должны быть выполнены, или вы столкнетесь с такими проблемами, как проблема, которую вы упомянули со значением, которое вы определяете, изменяя его.Этот шаблон обычно называется актом ввода ваших данных.Лучше всего указывать ваши данные по значениям, которые, как вы знаете, не изменятся, например, по идентификатору.Поскольку словари часто могут снизить стоимость дорогостоящих функций поиска, они необходимы во многих ситуациях, но, как я уже упоминал, и вы указали, вы должны либо указать их значение, которое не изменится и является уникальным, либо вам потребуется обновить и обработатьдублирует каждый раз, когда вы используете словарь.Какое решение необходимо, зависит от вашей ситуации.

Кроме того, библиотеки, такие как lodash, имеют встроенные функции (которые вы можете легко написать самостоятельно), которые принимают данные и вводят их для вас.Вы также найдете идеи такого рода, широко используемые в других языках, даже если они имеют разные названия (python: словарь, Java: hashMap и т. Д.)

0 голосов
/ 02 июля 2019

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

class NameMap<K, V extends { name: K }> {
    private items: Set<V> = new Set();
    Add(value: V) { this.items.add(value); }
    Get(key: K) {
        for(let e of this.items.values()) if(e.name == key) return e;
        return undefined;
    }
    [Symbol.iterator]() { return this.items[Symbol.iterator](); };
}

type ExampleItemList = NameMap<ExampleItemName, ExampleItem>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...