Как удалить элемент по определенному индексу в массиве?

Кто-нибудь знает, как удалить элемент в массиве? Есть ли встроенный метод для этого?

Если нет, кто-нибудь знает, как реализовать такой метод?

29 голосов | спросил user697 21 FebruaryEurope/MoscowbSun, 21 Feb 2016 04:13:54 +0300000000amSun, 21 Feb 2016 04:13:54 +030016 2016, 04:13:54

4 ответа


45

Используйте delete для удаления элемента:

delete array[index];

Если вы не хотите оставлять пробел, вам нужно переместить каждый элемент вручную:

contract test{
    uint[] array = [1,2,3,4,5];
    function remove(uint index)  returns(uint[]) {
        if (index >= array.length) return;

        for (uint i = index; i<array.length-1; i++){
            array[i] = array[i+1];
        }
        delete array[array.length-1];
        array.length--;
        return array;
    }
}

Если вам не нужен порядок, вы также можете просто скопировать последний элемент в пустое место, а затем удалить последний элемент.

ответил Tjaden Hess 21 FebruaryEurope/MoscowbSun, 21 Feb 2016 04:58:17 +0300000000amSun, 21 Feb 2016 04:58:17 +030016 2016, 04:58:17
9

Небольшая оптимизация для ответа Тьядена Хесса:

contract Test {
    uint[] array = [1,2,3,4,5];
    function remove(uint index)  returns(uint[]) {
        if (index >= array.length) return;

        for (uint i = index; i<array.length-1; i++){
            array[i] = array[i+1];
        }
        array.length--;
        return array;
    }
}

Я удалил строку delete array[array.length-1]; до array.length--;. Это делает работу дешевле на 5000 га. Компилятор автоматически очистит незанятые слоты при уменьшении длины массива. Сбрасывание двойного хранилища добавляет 5000 газов.

ответил medvedev1088 11 FebruaryEurope/MoscowbSun, 11 Feb 2018 23:07:47 +0300000000pmSun, 11 Feb 2018 23:07:47 +030018 2018, 23:07:47
2
pragma solidity ^0.4.11;
contract TestArray {
    uint[] public original;
    uint[] public newOr;
    event Log(uint n, uint a, uint b, uint c);

    function TestArray(){
        original.push(1);
        original.push(2);
        original.push(3);
        original.push(4);

    }

    function test(){
        newOr = remove(original, 1);
        Log(newOr.length, newOr[0], newOr[1], newOr[2]);
    }
    function remove(uint[] array, uint index) internal returns(uint[] value) {
        if (index >= array.length) return;

        uint[] memory arrayNew = new uint[](array.length-1);
        for (uint i = 0; i<arrayNew.length; i++){
            if(i != index && i<index){
                arrayNew[i] = array[i];
            } else {
                arrayNew[i] = array[i+1];
            }
        }
        delete array;
        return arrayNew;
    }

}
ответил rstormsf 13 J0000006Europe/Moscow 2017, 11:43:05
0
  

delete a присваивает начальное значение для типа a. То есть для   целые числа эквивалентны a = 0, но его также можно использовать на массивах,   где он присваивает динамический массив длины нуль или статический массив   такая же длина, когда все элементы сброшены. Для структур он присваивает   struct со сбросом всех членов.

     

> Я реализовал его, может быть полезно понять это простым   Пример

**

  

И если мы удалим элемент с помощью индекса, он не оставит пробел.

**

http://solidity.readthedocs.io/en/v0.4.21 /types.html

contract UserRecord {
    constructor() public { owner = msg.sender; }

    address owner;

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    struct User {
        bytes32 userEmail;
        uint index;
    }

    mapping (bytes32 => User) private users;

    bytes32[] private usersRecords;
    event LogNewUser(bytes32 indexed userEmail, uint index);

    function setUseremail(bytes32 _userEmail) public onlyOwner returns(bool success){
        users[_userEmail].userEmail = _userEmail;
        users[_userEmail].index = usersRecords.push(_userEmail) -1;

        emit LogNewUser(
        _userEmail,
        users[_userEmail].index
        );
        return true;
    }

//this will delete the user at particular index and gap will be not there

    function deleteUser(bytes32 _userEmail) public onlyOwner returns(uint index){
        require(!isUser(_userEmail)); 
        uint toDelete = users[_userEmail].index;
        bytes32 lastIndex = usersRecords[usersRecords.length-1];
        usersRecords[toDelete] = lastIndex;
        users[lastIndex].index = toDelete; 
        usersRecords.length--;
        return toDelete;   
    }    
}
ответил Vinay Kumar 10 Maypm18 2018, 14:19:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132