Contract-Development

獲取數組中元素的索引

  • April 18, 2022

我試圖從數組中刪除一個元素而不知道它在數組中的索引。有沒有辦法根據它的值而不是它的索引從數組中刪除一個元素?

就像是:

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它也可以用於非唯一數組。

引用自:https://ethereum.stackexchange.com/questions/121913