用特定的非空键值过滤地图列表的惯用 Elixir?

rag*_*ney 2 elixir

我是 elixir 的新手,正在尝试找出重写此 ruby​​ 方法的正确方法:

def filter_events(events)
  events.select { |event| event[:id].present? && event[:vhost].present? }
end
Run Code Online (Sandbox Code Playgroud)

在灵丹妙药。这是我到目前为止:

def filter_events(events) do
  Enum.filter(events, &(Map.has_key?(&1, :id) && Map.has_key?(&1, :vhost)))
end
Run Code Online (Sandbox Code Playgroud)

有没有更好/更惯用的方法来做到这一点?

Sov*_*iut 5

你的例子太短了,这并不重要;它是可读的。但是,大多数示例,包括docs 中的示例,都使用内联/匿名函数:

Enum.filter(events, fn(event) ->
  Map.has_key?(event, :vhost) and Map.has_key?(event, :id)
end)
Run Code Online (Sandbox Code Playgroud)

如果你正在寻找更聪明的东西,你可以使用模式匹配Kernel.match?()

Enum.filter(events, &match?(%{id: _, vhost: _}, &1))
Run Code Online (Sandbox Code Playgroud)

或使用内联函数:

Enum.filter(events, fn(event) -> match?(%{id: _, vhost: _}, event) end)
Run Code Online (Sandbox Code Playgroud)

由于您正在尝试检查键是否存在并且它们的值不为空,因此以下应该有效:

Enum.filter(events, fn(event) ->
  !is_nil(event[:vhost]) and !is_nil(event[:id])
end)
Run Code Online (Sandbox Code Playgroud)