У меня есть сопоставление списка структур (сопоставление (адрес => структура [])) У меня возникли проблемы с тем, как отобразить их все вместе во внешнем интерфейсе (я использую React js).
Спасибо.
Отображение — это хеш-таблица, в которой каждый возможный ключ сопоставлен с экземпляром элемента.
В отличие от массивов, это означает, что вы не можете сгенерировать ошибку, ссылаясь на несуществующий элемент, потому что все они существуют. Если в данный слот ничего не было записано, он вернет нулевой экземпляр ( false, 0, empty, 0x0
).
Кроме того, в отличие от массивов, невозможно перебрать ключи или узнать, сколько ключей существует, потому что они все существуют.
Важным преимуществом a mapping
является возможность доступа к элементу по идентификатору за одну операцию ( O(1)
). Это очень важно для смарт-контрактов.
mapping(address => struct) myMap; // id => struct
Таким образом, сопоставления очень полезны, но иногда мы также хотим иметь возможность перебирать ключи или подсчитывать их. Распространенным шаблоном является использование массива для хранения списка существующих сопоставлений.
Взгляните на «Отображенную структуру с индексом» здесь: Существуют ли хорошо решенные и простые шаблоны хранения для Solidity?
Надеюсь, поможет.
А mapping
не является array
. Вы не можете перебирать его. Он предназначен для O(1)
операций. Источник
Если перебирать или просто извлекать все известные существующие файлы structs
, я бы предложил следующее.
1: Сохраните
structs
вarray
2: Если вам нужны ассоциации пары ключей с
address
: используйтеmapping(address => uint256)
, гдеuint256
находится вindex
файле .struct
array
Примечание: поскольку я не знаю ваших полных требований, может существовать лучшая стратегия. Оцените и проанализируйте, что именно вам нужно от смарт-контракта, и действуйте оттуда. :)
Как Роб упомянул о картографии. Если вы хотите показать все данные во внешнем интерфейсе, лучшим способом было бы сохранить адреса в отдельном массиве. Таким образом, вы получаете список всех адресов, хранящихся в отображении.
Второй шаг — получить все адреса из массива и использовать цикл for во внешнем интерфейсе и извлекать отдельные данные один за другим.