elixir - 比较不同格式的 map - Elixir

标签 elixir

我在 Elixir 中使用 map 。

有些在 %{"foo": "bar"}格式

还有一些在 %{"foo" => "bar"}
我有两张 map :

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

我如何比较这两张 map ?
Map.equal?(a, b)

返回 false

最佳答案

您拥有的 map 没有不同的格式。他们有不同的键。

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 。一次转换每个 map ,然后再次测试它们是否相等。如果任何一张 map 都很大,这可能需要很长时间。

最好坚持如何Map.equal?/2作品。如果键的类型不同,则它们不应相等。但是,如果您确实需要,您可以自己进行转换。

关于elixir - 比较不同格式的 map - Elixir ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42003096/

相关文章:

elixir - 我可以将插头放在哪里,然后从 Phoenix 应用程序中的不同 Controller 使用它们?

constants - ?在 Elixir 中定义宏或 .hrl 文件备用以进行配置

namespaces - 如何在 Elixir Phoenix iex 控制台中停止强制模块命名空间?

elixir - Ecto 查询日期范围

elixir - Supervisor 和 DynamicSupervisor 的区别

postgresql - Elixir Ecto JSONb 查询

Elixir 检查 map 是否包含键列表

Elixir:为使用 mix escript.build 创建的发行版设置 cookie 和主机名

elixir - 解析 LIFX header 返回错误的协议(protocol)号

elixir - GenStage:如何处理生产者无法提供事件的情况?