Löschen Sie einen bestimmten Wert, der mit Array - Vertrag zugeordnet ist

Ich habe einen Vertrag geschrieben, der ein bis viele Beziehungselemente enthält. Jede ID enthält unterschiedliche Namen (z. B.: ID = 1 enthält die Namen a, b und c). Ich muss den Namen 'a' aus id = 1 löschen.

struct IdStruct{
    bytes12[] structArray; 
}

mapping(string => IdStruct) idStructs;

function appendNames(string id, bytes12 name) payable returns (bool success){ 
 idStructs[id].structArray.push(name); 
} 

function getName(string id) returns(bytes12[]){ 
  return idStructs[id].structArray; 
}

Ich habe es versucht delete idStructs[id].structArray[name];, aber nichts wird gelöscht, und wenn ich es versuche delete idStructs[id].structArray;, werden alle Namen unter id=1 gelöscht.

Antworten (2)

Ich schätze, deine Berufung delete idStructs[id].structArray. Das bedeutet, dass alle Elemente in einem Array gelöscht werden. Wenn Sie ein bestimmtes Element löschen möchten, müssen Sie alle Elemente in diesem Array durchlaufen. Wenn das Element übereinstimmt, müssen Sie dieses Element löschen.

Unten finden Sie Beispielcode:

function deleteElement(string id, bytes12 name){
    for(uint index=0;index<idStructs[id].structArray.length;index++){
        if(idStructs[id].structArray[index]==name){
            delete idStructs[id].structArray[index];
            break;
        }
    }
}
Danke, es funktioniert ... aber der Wert wird in null umgewandelt. Selbst wenn ich idStructs[id].structArray[0] lösche, existiert structArray[0] immer noch als null und gibt 0x000000000000000000000000000000000000000 zurück
delete aweist a den Anfangswert für den Typ zu. Dh für ganze Zahlen ist es äquivalent zu a = 0, aber es kann auch auf Arrays verwendet werden, wo es ein dynamisches Array der Länge Null oder ein statisches Array der gleichen Länge mit zurückgesetzten Elementen zuweist. Für Strukturen weist es eine Struktur zu, bei der alle Mitglieder zurückgesetzt werden. solidity.readthedocs.io/en/latest/…

Dies liegt daran, dass delete idStructs[id].structArray[name]versucht wird, das bytes12-Element bei index zu löschen name, was falsch ist. Was Sie hier tun möchten, ist das Element an seinem Index von 0 zu löschen. Hier ist eine Lösung dafür:

struct IdStruct {
    bytes12[] structArray; 
}

mapping(string => IdStruct) idStructs;

function appendNames(string id, bytes12 name) payable returns (bool success, uint index){ 
    idStructs[id].structArray.push(name); 
    return (true, idStructs[id].structArray.length-1);
} 

function getName(string id) returns(bytes12[]){ 
    return idStructs[id].structArray; 
}

function deleteName(string id, bytes12 name){
    for(uint index = 0;index<idStructs[id].structArray.length;index++){
        if(idStructs[id].structArray[index]==name){
            delete idStructs[id].structArray[index];
            break;//Don't break here if it might be in the array more than once
        }
    }
}

Alternativ können Sie den Benutzer den zu löschenden Index angeben lassen, indem Sie eine Funktion haben, die den Index des Werts abruft. Sie können auch den Namen und die ID für deleteName angeben und überprüfen, ob es das ist, was sie löschen möchten.