2017-06-22 108 views
0

我有兩個列表與地圖:藥劑/鳳凰退出循環

apps = [%{name: "app1", version: "0.0.1"}, %{name: "app2", version: "0.0.1"}] 
updates_list = [%{name: "app1", version: "0.0.2"}, 
       %{name: "app2", version: "0.0.1"}, 
       %{name: "app3", version: "0.0.1"}, 
       %{name: "app4", version: "0.0.1"}] 

,並需要通過updates_list枚舉,把新鑰匙插入在apps列表中的每個元素顯示,如果有更新。即在這裏有新的版本爲app1,我需要添加new_version: true/false並得到期望的結果:

result = [%{name: "app1", version: "0.0.1", new_version: true}, 
      %{name: "app2", version: "0.0.1", new_version: false}] 

我曾嘗試用下面的函數:

updates_map = Enum.map(updates_list, fn (x) -> Map.put(%{}, x.name, x.version) end) 
result = Enum.map(apps, fn (x) -> map_updates(x, updates_map) end) 

和功能:

defp map_updates(app, updates_map) do 
    app_map = Map.from_struct(app) 
    for update <- updates_map do 
    if Map.has_key?(update, app_map.name) do 
     if Map.fetch(update, app_map.name) != app_map.version do 
     app_map = app_map |> Map.put(:new_version, true) 
     else 
     app_map = app_map |> Map.put(:new_version, false) 
     end 
    else 
     app_map = app_map 
    end 
    end 
    app_map 
end 

但是,因爲它列舉了所有的updates_map爲每個應用程序,它只是覆蓋它,我沒有結果。如何退出循環,或保留更改以達到上述result?任何建議表示讚賞!

回答

2

如果O(n*m)解決方案是可以接受的,並且新版本的存在條件只是在update_map中存在具有相同名稱和不同版本的條目,則無需編寫這麼多代碼(這是我認爲您的代碼一樣)。這可以用一個for和一個嵌套Enum.any?來完成:

apps = [%{name: "app1", version: "0.0.1"}, %{name: "app2", version: "0.0.1"}] 
updates_map = [%{name: "app1", version: "0.0.2"}, 
       %{name: "app2", version: "0.0.1"}, 
       %{name: "app4", version: "0.0.1"}, 
       %{name: "app4", version: "0.0.1"}] 

updated_apps = for app <- apps do 
    new_version = Enum.any?(updates_map, fn update -> 
    app.name == update.name && app.version != update.version 
    end) 
    Map.put(app, :new_version, new_version) 
end 

IO.inspect updated_apps 

輸出:

[%{name: "app1", new_version: true, version: "0.0.1"}, 
%{name: "app2", new_version: false, version: "0.0.1"}] 

如果您需要這在大量的應用程序和更新運行,你應該轉換更新轉換成某種Map,以便內部邏輯執行得更快。

+0

嘿@Dogbert我試過你的解決方案,它的工作原理!謝謝!我沒有考慮從Enum.any中使用布爾值?現在看起來更簡單了!祝你今天愉快! – Ilya