Contract-Development
獲取數組中元素的索引
我試圖從數組中刪除一個元素而不知道它在數組中的索引。有沒有辦法根據它的值而不是它的索引從數組中刪除一個元素?
就像是:
index = array.find(元素)
刪除數組
$$ index $$
Solidity 中沒有數組 findByElement 的實現。
但是您可以通過以下幾種方式來實現:
- 編寫自己的函式來查找元素,可以簡單為:
function findElementInArray(element, arr) public returns(int) { bytes32 encodedElement = keccak256(abi.encode(element.id)); for (int i = 0 ; i < arr.length; i++) { if (encodedElement == keccak256(abi.encode(element.id))) { return i; } } return -1; }
- 使用映射將對像中的 ref 保存到數組中元素的索引中
mapping(_YourObject -> int) arrayIndexes // delete object: delete array(arrayIndexes[object])
我有一個,你可以把它用作圖書館。
library Array { function removeElement(uint256[] storage _array, uint256 _element) public { for (uint256 i; i<_array.length; i++) { if (_array[i] == _element) { _array[i] = _array[_array.length - 1]; _array.pop(); break; } } } }
將其導入程式碼,並像這樣呼叫它:
yourArray.removeElement(element)
以這種方式工作:遍歷數組,如果索引元素在那裡,則將該元素移動到數組的末尾並用
.pop()
.限制是數組的大小,因為您必須對其進行循環,並且數組必須只包含唯一元素。我不完全確定,但從技術上講,如果你刪除
break
它也可以用於非唯一數組。