# DataMap

## 声明

声明一个DataMap的方法与IData其他子类的声明不同。

```csharp
import crafttweaker.data.IData;

val myFirstMap as IData = {key1: "value1",
                  key2: "value2",
                  key3: 3};
```

你甚至可以嵌套，NBT大多也是这样

```csharp
val nestedMap as IData = { key1: 
                    {
                        key1: "hello"
                    }
                };
```

## 修改

然而 DataMap 的元素不能直接修改，你也可以用 key 检索其中的元素，将会返回这个 key 对应的值，均以 IData 形式返回。

```csharp
val mySecondMap as IData = {key1: "value1",
                   key2: "value2",
                   key3: 3};

// 检索叫做 "key1" 的成员
var k1 as IData = mySecondMap.key1;
print(k1.asString());

// 检索叫做 "key2" 的成员
var k2 as IData = mySecondMap.memberGet("key2");
print(k2.asString());
```

你可以用 `+` 来合并两个IDataMap和 `-` 来裁剪IDataMap。合并时，相同key的值后者会覆盖前者（这是你唯一可以「修改」值的方法，注意它们都不会真正修改原有的 DataMap，而是返回一个新的 DataMap 结果是两个 DataMap 合并/裁剪后的）。裁剪可以去除特定key的元素。

```csharp
val map1 as IData = {
    key1 : "hello",
    key3 : "test",
};

val map2 as IData = {
    key2 : "bye",
    key3 : "override"
};

print((map1 + map2).asString()); // 打印出 {key1 : "hello", key2 : "bye", key3 : "override"}



val map3 as IData = {
    key1 : "two",
    key2 : "two",
    key3 : "three"
};

print((map3 - "key1").asString()); // 打印出 {key2 : "two", key3 : "three"}

val map4 as IData = {
    key3 : "anything"
};

print((map3 - map4).asString()); // 打印出 {key1 : "two", key2 : "two"}
```

## in/has 操作符

你可以用 in/has 操作符来检测一个 DataMap 是否有指定的 key

```csharp

val map3 as IData = {
    key1 : "two",
    key2 : "two",
    key3 : "three"
};

print(map3 has "key1"); // true
print(map3 has "key4"); // false
```
