如何在 Solidity 映射中检查值或对象是否存在?

1,426 阅读2分钟

本教程解释了如何检查Solidity映射中存在的对象。

java中的映射与solidity中的哈希表相似。

它存储键和值,每个键持有值类型(原始类型),值类型是参考类型(结构、嵌套映射、数组对象)。

在solidity中,每个键都被映射为值。如果值不存在,意味着值为零。

在 solidity 中有nullundefinedempty 对象概念。

映射值被初始化为有效类型的值。

未初始化的映射对象的值是零。

如何检查solidity映射中的对象是否为空?

映射存储键和值,以这样的方式,每个有效的键都被映射成默认的零值的字节表示。

让我们声明一个Employee的结构,其中包含uint 的id和string 类型的名称。

    struct Employee {
       uint id;
       string name;
    }

让我们在映射中用一个字符串键来存储该结构。因此,声明并定义了mapping 结构。

    mapping (string => Employee) employees;

它将字符串作为键,将值存储为Employee结构。

字符串被映射为结构默认值的字节表示。

与其他语言(java,javascript)不同,在solidity中存在空或未定义。

如果没有对象,值会被分配到零字节。

如果存在一个引用类型,比如数组或结构,那么这些值就是默认的零字节表示。

检查对象是否存在,mapping[key]== address(0x000000000000)。

下面是一个在solidity中检查对象是否为空的示例代码

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Test {

    struct Employee {
       uint id;
       string name;
    }

    mapping (string => Employee) employees;

    function isMappingObjectExists(string memory key) public view returns (bool) {
        if(employees[key].id > 0){
            return true;
        } 
        else{
            return false;
        }
        return false;
    }
}

这包含isMappingObjectExists ,如果对象不是空的,返回true,返回false。

首先,使用语法mapping[key] ,获得一个对象的值,它返回一个struct 对象。

它检查一个结构对象的属性值是否大于零(0)。

另一种方法,是检查一个对象的bytes 长度是否为零。

 function isMappingObjectExists(string memory key) public view returns (bool) {
        if(bytes(employees[key]).length>0){
            return true;
        }
        else{
            return false;
        }
        return false;
}

这种方法,从一个给定的映射键计算出一个对象的字节,检查字节对象的长度是否大于零(0)

总结

因此,使用下面的方法检查映射值对象是否存在

  • 检查对象的属性值是否为零
  • 检查字节对象的长度是否为零