键值对在按键里面并没有专门的介绍,在别的编程语言里面存储键值对的容器会叫它字典,属于数组的范畴,我们这期文章姑且也叫它字典。
键值对的构成是键名(key)以及索引的对象键值(value),将多个键值对放入到大括号{}中就形成字典,如下所示:
- Dim dict={
- "name" : "小明",
- "age" : 7,
- "class" : "一年级"
- }
复制代码
注:为了看着方便,这里代码做了分行处理,并不能直接运行,实际使用时这是一行代码或者在分行处用续行符(_)连接。要访问字典的成员,可以使用键索引,如下所示:
通过索引就可以得到“name”对应键值“小明”。
关于命名是键名key的规则:
可以字符串,如上面的例子,也可以是
字符串类型的数字。
也可以是变量:
- Dim a="name"
- Dim dict={a:"小明"}
- TracePrint dict[a]
复制代码修改索引对象的值,比如修改小明的年龄(age)为8,那么可以这样写:
在字典中插入新的键值对,如下所示:
删除键值对的操作,目前在按键精灵中并没有看到,暂时空着。。。
创建空的字典有3种方式:
- Dim dict()
- Dim dict=array()
- Dim dict={null}
复制代码后2种方式也是可以清空字典里面的内容。
遍历字典里面的全部键值对:
- Dim dict={"name":"小明","age":7,"class":"一年级"}
- For Each k , v In dict
- TracePrint k,v
- Next
复制代码k是key简称对应的是键值,v是value的简称对应的是索引值
重复运行遍历字典的操作,会发现每次运行结果的顺序是不一样的,即下面这3条是随机排序的,也就是说字典的内容是无序数据。
- 当前脚本第3行:age 7
- 当前脚本第3行:name 小明
- 当前脚本第3行:class 一年级
复制代码输出字典里面的全部内容,在数组中是可以用join命令合并数组然后输出,如下所示:
- Dim arr=array(1,2,3)
- TracePrint join(arr,",")
复制代码输出结果:
但是join命令对字典无效,输出为空值,想要输出字典的全部内容,需要用table转json命令,然后输出。
- Dim dict={"name":"小明","age":7,"class":"一年级"}
- Dim json=encode.TableToJson(dict)
- TracePrint json
复制代码输出结果:
- 当前脚本第3行:{"age":7,"class":"一年级","name":"小明"}
复制代码获取字典有多少个键值对,测试用UBuound或者len命令都不行,那么换一个思维,每一个键值对之间是用逗号分隔的,先转json,当做普通的字符串,用逗号分隔得到新的数组,然后获取数组最大下标,就可以知道键值对的个数了,这个方式虽然绕了点,但是也可以实现。
为了方式键值中含有逗号,也可以用逗号+引号作为分割符,增加精准度。
以上介绍的内容都是一维的字典,实际应用时可能会是多维的字典,如下:
- Dim table={"success":200,"data":{"code":"验证码是1646"}}
- TracePrint table["data"]["code"]
复制代码输出结果:
所谓多维字典就是键值对的索引对象依然是字典。
- {
- "success": 200,
- "data": {
- "code": "验证码是1646"
- }
- }
复制代码即data的键值是{"code":"验证码是1646"}
关于字典的多维的维数是没有限制的,理论上是可以无穷的。
实际应用的例子:
在游戏中记录账号的数据:
- {
- "名称": "小A",
- "等级": "5",
- "经验": 80,
- "金币": "5000"
- }
复制代码通过这个字典可以记录账号的数据,当数据发生变化以后也可以修改,如等级由5级变成6级,可以这样写。
- Dim 账号={"名称":"小A","等级":"5","经验":80,"金币":"5000"}
- 账号["等级"] = 账号["等级"] + 1
- TracePrint 账号["等级"]
复制代码输出结果:
新的字典数据就变成了:
- {"名称":"小A","等级":6,"经验":80,"金币":"5000"}
复制代码字典存储数据适合于多个无序数据的存储,方便调用及修改。