Solidity
在不知道索引的情況下刪除動態數組元素的最佳方法
我有這個映射
mapping(bytes32 => address[]) public authorisation;
這將雜湊與授權使用者列表映射。
我有一個要添加和確認的功能 - 這些工作正常且不是問題。但是現在我需要添加一個刪除功能,在給定雜湊和地址的情況下,該地址被撤銷訪問/權限
function deletePermission(bytes32 hash, address user) public {// get index of element with the address = user, then delete this element from the array.}
我已經看過這裡,但沒有找到任何索引未知的解決方案。我知道您可以遍歷數組,直到找到與地址匹配的元素,但這將非常昂貴(就 gas 而言)。有沒有更有效的方法來做到這一點?謝謝
添加到數組時,您還可以儲存添加到的索引。您可以使用第二個映射來做到這一點:
mapping(bytes32 => mapping(address => uint256)) public authorisation_arrayIndex;
添加到
authorisation
映射時:authorisation_arrayIndex[hash][addr] = authorisation[hash].length; authorisation[hash].push(addr);
此外,也許您應該考慮直接使用一個映射而不是數組和數組索引映射。例如:
mapping(bytes32 => mapping(address => bool)) public authorisation;
這樣您就可以輕鬆添加和刪除:
authorisation[hash][addr] = true; authorisation[hash][addr] = false;
…缺點是您無法遍歷它們。