map

在不同语言中, "map"有许多不同的名称, Z1h中的"map"对应以下语言各自对相同概念的称呼是类似的:

语言 名称 特性或主要差异
Z1h map 无序、线程不安全
Z1h Map 无序、线程安全
Go map[string]interface{} 不允许通过s.key=value进行赋值,只允许s["key"]进行操作
Python dict 不允许通过s.key=value进行赋值,只允许s["key"]进行操作
JavaScript Object
Java HashMap 只能用方法进行操作
Objective-C NSMutableDictionary
C# Dictionary

声明

创建一个map的方法有:

// 线程不安全的map

// 创建一个空的map
m1 = {}

// 初始化了常量内容
m2 = {"name": "z"}

// 初始化时, key可以省略字符串标识('、"、\`)
m3 = {name: "z"}

// 初始化时, key与变量名相同时
m4 = {m3}

// 线程安全的map

// 初始化一个多线程安全的map
m5 = new(sync.Map)

// 初始化一个有限制key个数、自动淘汰冷门键的线程安全map
m6 = new("weak")
m7 = new("weak", 2) // key个数限制最多为2, 超过2个时触发淘汰

// 初始化一个有过期淘汰机制的线程安全map
m8 = new("expire")
m9 = new("expire", 3) // key的默认过期时间为3秒
m10 = new("expire", new("weak")) // 同时执行两个淘汰策略

此外还有使用方法进行生成

// 从字符串转换成map
m11 = JSON.parse(`{"name": "zzz"}`)

赋值

采用以下几种方式可以进行赋值

  • map变量名 . key = value
  • map变量名[key] = value

示例:

m = {
    name: "z",
};
m.age = 18; // 设置age
m["tall"] = 171;  // 设置tall
key = "weight";
m[key] = 61.5; // 设置weight
print(m);

上例将会输出

{"age":18,"name":"z","tall":171,"weight":61.5}

取值

用以下几种方法可以从map取值

  • map变量名 . key
  • map变量名[key]
  • {key1, key2} = 变量名

承接上文的环境:

print("名称:", m["name"]);
print("身高:", m.tall);
{age, weight} = m;
print(`年龄: ${age}, 体重: ${weight}`);

上例将会输出

名称: z
身高: 171
年龄: 18, 体重: 61.5

可选链

如果尝试对map进行取值时, key不存在, 会抛出Kind xxx doesn't have key [xxx]的错误, 此时有两种方式可以判断、取值

  • has(map对象, key) // 返回bool类型
  • map对象 ?. key // 如果key不存在,返回nil
  • map对象 ? [key变量] // 如果key不存在,返回nil

承接上文的环境:

print(has(m, "name")); // true
print(m?.name); // z
print(has(m, "gender")); // false
print(m?.gender); // null
print(m?["score"]); // null

可选链的更多说明可以参考文档运算符

后置递增递增、递减

对map的某个key进行递增, 例如

m.age++; // 19
m["age"]++ // 20
m.weight--; // 60.5
m["weight"]--; // 59.5

如果是线程不安全的map, 可以对不存在的key进行递增以便记数

m.score++; // 1
m["score"]++ // 2

移除key

线程不安全的map的删除方法如下:

del(m, "age");

key = "score";
del(m, key);

线程安全的Map的删除方法如下:

m.Delete("age");

key = "score";
m.Delete("age");

序列化

以下方法可以将线程不安全的map转换成字符串

  • JSON.stringify(m);
  • string(m);

获取key列表

Object.keys(m)

获取value列表

Object.values(m)

遍历

// 方式1
for (k, v in m) {
    print(`Key = ${k}, Value = ${v}`)
};
// 方式2
Object.keys(m).forEach(k => {
    print(`Key = ${k}, Value = ${m[k]}`)
});