繁体   English   中英

如何在 Solidity 中优化此智能合约 function 关于删除数组特定索引中的元素

[英]How to optimize this smart contract function in Solidity about deleting an element in particular index of an array

我使用以下库代码根据其索引删除数组中的元素。 在我看来,唯一的方法是使用循环,但它会消耗大量气体。 还有其他优化代码可以解决这个问题吗?

library ArrayLibrary {
    function remove(uint[] storage _arr, uint _removedIndex) public returns(uint[] memory){
        require(_arr.length > 0, "No element in Array.");
        for(uint i; i < _arr.length - 1; i++){
            if (i >= _removedIndex) {
                _arr[i] = _arr[i + 1];               
            } 
        }
        _arr.pop();
        return _arr;
    }
}


contract TestLibrary {
    uint[] arr;
    using ArrayLibrary for uint[];

    function deleteArrEle(uint[] calldata _arr, uint deletedIndex) public returns (uint[] memory deletedArr) {
        arr = _arr;
        deletedArr = arr.remove(deletedIndex);
    }
}

如果您不介意调换项目的顺序,您可以将最后一项复制到不需要的项目的 position,然后删除最后一项。

function remove(uint[] storage _arr, uint _removedIndex) public returns(uint[] memory){
    require(_arr.length > 0, "No element in Array.");
    _arr[_removedIndex] = _arr[_arr.length-1];
    _arr.pop();
    return _arr;
}

输入数组[1,2,3,4] ,从索引 1(值 2)处删除。 Output [1,4,3]


链接排序列表还有一些更复杂的解决方法。 例如,Liquity 协议的SortedTroves中的示例代码。

排序后的数据不存储在数组中,而是存储在指向上一个和下一个项目的结构映射中。

  • 关键一:
    • 值 1
    • 链接到上一个键:空(意味着没有以前的值)
    • 链接到下一个键:D
  • 密钥 C:
    • 值 7
    • 链接到上一个密钥:D
    • 链接到下一个键:空(意味着没有下一个键)
  • 关键D:
    • 值 5
    • 链接到上一个密钥:A
    • 链接到下一个密钥:C

该合同还包含有关最低和最高价值的密钥的信息。

当您删除一个项目时,您只会删除这个特定项目,并更改最初指向该项目的 2 个链接(下一个和上一个)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM