我有这样的事情: mapping(address => mapping(string => uint))m_Map;
可以访问 m_Map [strCampaignName] [addrRecipient],广告系列可以有多个收件人...
现在在某个时候(ICO失败),我需要删除所有收件人的广告系列。我不觉得简单 删除m_Map [strCampaignName]将起作用。 如果我使用 m_Map [strCampaignName] = null,我认为数据不会被删除... 如果我遍历所有收件人的列表,我将耗尽气体......
如何处理这种情况? 敏:我希望m_Map [strCampaignName]为空, 马克斯:我想停止在上面浪费记忆。
提前谢谢。
答案 0 :(得分:0)
如果您拥有映射的所有 addrRecipient
delete m_Map[strCampaignName][addrRecipient];
有效。
答案 1 :(得分:-1)
如您所述,您无法删除Solidity中的mapping
。 “清除”数据的唯一方法是遍历键(使用存储键的单独数组)并删除单个元素。但是,关注成本是正确的......根据映射的大小,您可能会遇到耗气问题。
解决此问题的常用方法是在映射中使用struct
进行软删除:
struct DataStruct {
mapping(string => uint) _data;
bool _isDeleted;
}
mapping(address => DataStruct) m_Map;
现在,删除条目只需要设置标记:m_Map[someAddr]._isDeleted = true;