Elixir 地图检查是否不为空且密钥存在
Elixir map check if not empty and key exists
我正在尝试找出一种方法来检查 Phoenix 应用程序(使用 Elixir)中的参数散列是否具有特定密钥。
在模型的以下变更集函数中,参数默认为:empty。
def changeset(model, params \ :empty) do
我需要弄清楚哈希中是否存在名为 :username 的键。
只是一个小术语,params 是映射而不是散列。这与知道在何处查看文档有关。
对于地图有 has_key?/2 其中 returns true
或 false
.
Map.has_key?(params, :name)
既然您使用的是 Ecto 变更集,那么您也可以使用 Ecto.Changeset.get_change/3。
get_change(changeset, key, default \ nil)
此returns default
如果key
未设置。请注意,如果 key
设置为 nil
,则 nil
仍将返回。如果 nil
是允许的更改值,那么您可能需要设置不同的默认参数。
Gazeler 的回答显然非常好。我只会在混合中添加模式匹配,在我看来,这是最清晰的解决方案,它不仅适用于 phoenix,而且适用于 Elixir 中任何地方的任何地图。
# head-only declaration for default params
def changeset(model, params \ :empty)
def changeset(model, %{"username" => _} = params) do
# username field is in params
end
def changeset(model, params) do
# username is not in params
end
我正在尝试找出一种方法来检查 Phoenix 应用程序(使用 Elixir)中的参数散列是否具有特定密钥。
在模型的以下变更集函数中,参数默认为:empty。
def changeset(model, params \ :empty) do
我需要弄清楚哈希中是否存在名为 :username 的键。
只是一个小术语,params 是映射而不是散列。这与知道在何处查看文档有关。
对于地图有 has_key?/2 其中 returns true
或 false
.
Map.has_key?(params, :name)
既然您使用的是 Ecto 变更集,那么您也可以使用 Ecto.Changeset.get_change/3。
get_change(changeset, key, default \ nil)
此returns default
如果key
未设置。请注意,如果 key
设置为 nil
,则 nil
仍将返回。如果 nil
是允许的更改值,那么您可能需要设置不同的默认参数。
Gazeler 的回答显然非常好。我只会在混合中添加模式匹配,在我看来,这是最清晰的解决方案,它不仅适用于 phoenix,而且适用于 Elixir 中任何地方的任何地图。
# head-only declaration for default params
def changeset(model, params \ :empty)
def changeset(model, %{"username" => _} = params) do
# username field is in params
end
def changeset(model, params) do
# username is not in params
end