2017-04-10 120 views
0

假設這data_set的選擇建築選項,從藥劑地圖

%{"ACTION" => "avail.datacenters", 
"DATA" => [%{"ABBR" => "dallas", "DATACENTERID" => 2, 
    "LOCATION" => "Dallas, TX, USA"}, 
%{"ABBR" => "fremont", "DATACENTERID" => 3, 
    "LOCATION" => "Fremont, CA, USA"}, 
%{"ABBR" => "atlanta", "DATACENTERID" => 4, 
    "LOCATION" => "Atlanta, GA, USA"}, 
%{"ABBR" => "newark", "DATACENTERID" => 6, "LOCATION" => "Newark, NJ, USA"}, 
%{"ABBR" => "london", "DATACENTERID" => 7, 
    "LOCATION" => "London, England, UK"}, 
%{"ABBR" => "tokyo", "DATACENTERID" => 8, "LOCATION" => "Tokyo, JP"}, 
%{"ABBR" => "singapore", "DATACENTERID" => 9, 
    "LOCATION" => "Singapore, SG"}, 
%{"ABBR" => "frankfurt", "DATACENTERID" => 10, 
    "LOCATION" => "Frankfurt, DE"}, 
%{"ABBR" => "shinagawa1", "DATACENTERID" => 11, 
    "LOCATION" => "Tokyo 2, JP"}], "ERRORARRAY" => []}} 

在Ruby中,我能做到

formatted_array_of_hashes = data_set.each.map{ |h| { h["LOCATION"] => h["DATACENTERID"] }} 

然後

merged_hash = Hash[*formatted_array_of_hashes.map(&:to_a).flatten] 

...我將有位置,datacenterid用於選擇標記。

請問我該如何在Elixir中實現類似的功能?

在正確的方向的任何指針將高度讚賞

+0

像這樣:'用於%{ 「LOCATION」=> K, 「DATACENTERID」=> V} < - data_set,放入:%{},do:{k,v}'? – Dogbert

回答

0

您可以使用for,在do返回一個2元組,並把它into: %{}

map = for %{"LOCATION" => k, "DATACENTERID" => v} <- data_set, into: %{}, do: {k, v} 

如果你想使用這個不過,你不需要建立地圖。你可以傳遞一個元組列表。這樣你就不會像地圖一樣丟失元素的順序,因爲地圖是無序的。

select _, _, for(%{"LOCATION" => k, "DATACENTERID" => v} <- data_set, do: {k, v}) 

旁註:Ruby代碼也可以被簡化爲:

hash = data_set.map { |h| [h["LOCATION"], h["DATACENTERID"]] }.to_h 
+0

哇!非常感謝你簡化我的Ruby代碼。不管怎樣,示例代碼返回一個空的Map。當與select一起使用時,我得到一個Protocol.UndefinedError, 協議Enumerable not implemented – dev

+0

啊,是'data_set [「DATA」]''中的列表嗎?然後將'< - data_set'更改爲'< - data_set [「DATA」]'。如果模式不匹配,'for'會默默忽略該值。 – Dogbert

+0

非常感謝! – dev