比较不同格式的地图 - elixir

时间:2017-02-02 13:08:43

标签: elixir

我在elixir中使用地图。

部分内容为%{"foo": "bar"}格式

有些人在%{"foo" => "bar"}

我有两张地图:

a = %{"foo": "bar"}
b = %{"foo" => "bar"}

如何比较这两张地图?

Map.equal?(a, b)

返回false

1 个答案:

答案 0 :(得分:3)

您拥有的地图的格式不同。他们有不同的钥匙。

iex(1)> Map.equal? %{"foo": 4}, %{:"foo" => 4}
true

使用第一个("foo":)只是写第二个(:"foo" =>)的简写

当前Map.equal?/2函数用于确保键和值相同。

在Elixir :"foo"中是一个原子而"foo"是一个二进制文件(有时也称为字符串)。

iex(1)> is_atom :"foo"
true
iex(2)> is_binary :"foo"
false
iex(3)> is_atom "foo"
false
iex(4)> is_binary "foo"
true

这就是Map.equal?/2失败的原因,因为这两个值不相同。

但是,如果你不关心不同的类型,只关心"内容"在类型中,您可以将所有键(可能是值)转换为字符串,然后进行比较。

for {key, value} <- my_map do
  {inspect(key), inspect(value)}
end

请注意,上面的代码没有考虑嵌套地图,只会盲目地将其转换为字符串,这可能是您想要的,也可能不是。

不幸的是,这意味着您需要多次遍历两个地图。一旦转换每个地图,然后再次测试它们是否相等。如果任何一张地图都很大,这可能需要很长时间。

最好坚持Map.equal?/2的工作方式。如果键的类型不同,则它们不应相等。但是,如果你真的需要,你可以自己进行转换。