как мне пройти через отображение адреса [дубликат]

У меня есть сопоставление списка структур (сопоставление (адрес => структура [])) У меня возникли проблемы с тем, как отобразить их все вместе во внешнем интерфейсе (я использую React js).

Спасибо.

Ответы (3)

Отображение — это хеш-таблица, в которой каждый возможный ключ сопоставлен с экземпляром элемента.

В отличие от массивов, это означает, что вы не можете сгенерировать ошибку, ссылаясь на несуществующий элемент, потому что все они существуют. Если в данный слот ничего не было записано, он вернет нулевой экземпляр ( 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файле .structarray

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

Как Роб упомянул о картографии. Если вы хотите показать все данные во внешнем интерфейсе, лучшим способом было бы сохранить адреса в отдельном массиве. Таким образом, вы получаете список всех адресов, хранящихся в отображении.

Второй шаг — получить все адреса из массива и использовать цикл for во внешнем интерфейсе и извлекать отдельные данные один за другим.