繁体   English   中英

从数组中查找并删除元素(可靠性)

[英]find and remove element from array (solidity)

我已经完成了一项任务:在工作表中找到特定地址,将其移至工作表末尾,然后通过 function 弹出消息将其删除:这是代码:

function removeAccount(address _account) external{
        uint counter = arrayOfAccounts.length;
        uint index;
        for(uint i; i < counter; i++) {
            if(arrayOfAccounts[i] == _account){
                index = i;
                break;
            }
        for(uint i = index; i < counter-1; i++){
                arrayOfAccounts[i] = arrayOfAccounts[i + 1];
            }
            arrayOfAccounts.pop();
        }
    }
        }
    }

交易到 Wote.removeAccount 错误:VM 错误:还原。

revert 交易已经恢复到最初的state。 注意:被叫function 应该是支付的,如果你发送价值并且你发送的价值应该小于你的当前余额。 调试事务以获取更多信息。

如果您不关心地址顺序

function removeAccount(address _account) external {
    if(arrayOfAccounts.length == 1) {
        arrayOfAccounts.pop();
    }
    else if(arrayOfAccounts[arrayOfAccounts.length - 1] == _account) {
        arrayOfAccounts.pop();
    }
    else {
        for (uint i = 0; i < arrayOfAccounts.length - 1; i++) {
            if(_account == arrayOfAccounts[i]) {
                arrayOfAccounts[i] = arrayOfAccounts[arrayOfAccounts.length - 1];
                arrayOfAccounts.pop();
            }
        }
        
    }
}

如果订单很重要

function removeAccount(address _account) external{
        uint counter = arrayOfAccounts.length;
        for(uint i; i < counter; i++) {
            if(arrayOfAccounts[i] == _account){
                for(uint j = i; j < counter-1; j++){
                    arrayOfAccounts[j] = arrayOfAccounts[j + 1];
                }
                arrayOfAccounts.pop();
                break;
            }
        }
    }
}

否则如果顺序无关紧要

function removeAccount(address _account) external{
    uint numAccounts = arrayOfAccounts.length;
    for(uint i = 0; i < numAccounts; i++) {
        if(arrayOfAccounts[i] == _account){    // if _account is in the array
            arrayOfAccounts[i] = arrayOfAccounts[numAccounts - 1];    // move the last account to _account's index
            arrayOfAccounts.pop();    // remove the last account
            break;
        }
    }
}

原因很简单。 您在第一个for循环中使用了第二个for循环。 并且还请用counter初始化index

uint256 index = counter;

并且仅在index小于counter时弹出

暂无
暂无

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

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