2016-04-24 53 views
2

required_keys = [ "a", "b", "c" ]藥劑檢查,如果地圖包含鍵

map_to_check = %{ "x" => "foo", "y" => "bar", "z" => "baz" }

鑑於上述required_keys列表和map_to_check地圖列表,我怎麼能輕易測試,如果map_to_check包含所有required_keys名單發現,在藥劑的鑰匙?

我知道我可以使用Map.has_key?(map_to_check, "a")檢查一個值是否存在。

,並試圖遍歷required_keys因爲我用Enum.map像這樣給了我一個錯誤:

Enum.map(required_keys, fn k -> Map.has_key?(Map.keys(map_to_check), k) end) 

以上沒有工作,因爲Enum.map不遍歷列表。

編輯

從尋找問題的答案,我發現我的解決方案沒有工作的原因是不是因爲Enum.map無法遍歷列表,而是由於事實我經過在列表中Map.has_key?函數調用Map.keys(map_to_check)

所以下面的替代也應努力:

Enum.map(required_keys, fn k -> Map.has_key?(map_to_check, k) end) 
+6

http://stackoverflow.com/questions/36775591/proper-way-to-determine-if-a-map-has-certain-keys/36775754#36775754 – Dogbert

回答

5

嘗試Enum.all?/2

required_keys |> Enum.all?(&(Map.has_key?(map_to_check, &1))) 
+1

如果你只是需要檢查,如果給定map總是有一些鍵,你可以使用[structs](http://elixir-lang.org/getting-started/structs.html#defining-structs),它在編譯期間給出檢查。 – tkowal

+0

謝謝。這個答案工作完美! – dnshio