我正在嘗試創建一個具有唯一值的新哈希陣列,并尊重重復哈希的最高版本。哈希如下所示:
old_hash = [
{"dependency"=>"websocket", "version"=>"2.8.0", "repo"=>"repo1"},
{"dependency"=>"rails", "version"=>"6.2.0", "repo"=>"repo2"},
{"dependency"=>"httparty", "version"=>"6.0.3.5", "repo"=>"repo2"},
{"dependency"=>"httparty", "version"=>"6.1.0.2", "repo"=>"repo2"},
{"dependency"=>"httparty", "version"=>"6.1.3.2", "repo"=>"repo2"},
{"dependency"=>"rails", "version"=>"6.1.0", "repo"=>"repo3"},
{"dependency"=>"metasploit", "version"=>"2.8.0", "repo"=>"repo3"}
]
如您所見,第三個、第四個和第五個散列具有相同的鍵值dependencywhich ishttparty和repowhich is repo2,但第五個散列具有這三個中的最高版本。因此,我想創建一個具有第一個、第二個、第五個、第六個和第七個哈希值的唯一哈希值。所以我想要的結果應該是這樣的:
unique_hash = [
{"dependency"=>"websocket", "version"=>"2.8.0", "repo"=>"repo1"},
{"dependency"=>"rails", "version"=>"6.2.0", "repo"=>"repo2"},
{"dependency"=>"httparty", "version"=>"6.1.3.2", "repo"=>"repo2"},
{"dependency"=>"rails", "version"=>"6.1.0", "repo"=>"repo3"},
{"dependency"=>"metasploit", "version"=>"2.8.0", "repo"=>"repo3"}
]
關于版本比較,我正在考慮使用這種方法來比較它們:
def version_greater? (version1, version2)
Gem::Version.new(version1) > Gem::Version.new(version2)
end
true在 version1 大于 version2 的情況下回傳。
我將不勝感激任何有助于解決此問題的建議。
uj5u.com熱心網友回復:
一種方法是使用Hash#update(又名merge!)的形式,它采用一個塊(此處{ |_,o,n| n["version"] > o["version"] ? n : o })來確定存在于被合并的兩個散列中的鍵的值。
old_hash = [
{"dependency"=>"websocket", "version"=>"2.8.0", "repo"=>"repo1"},
{"dependency"=>"rails", "version"=>"6.2.0", "repo"=>"repo2"},
{"dependency"=>"httparty", "version"=>"6.0.3.5", "repo"=>"repo2"},
{"dependency"=>"httparty", "version"=>"6.1.0.2", "repo"=>"repo2"},
{"dependency"=>"httparty", "version"=>"6.1.3.2", "repo"=>"repo2"},
{"dependency"=>"rails", "version"=>"6.1.0", "repo"=>"repo3"},
{"dependency"=>"metasploit", "version"=>"2.8.0", "repo"=>"repo3"},
{"dependency"=>"rails", "version"=>"6.1.9", "repo"=>"repo2"}
]
請注意,我在問題中添加了一個哈希值old_hash。(順便說一句,“old_hash”可能不是陣列的最佳名稱。)
old_hash.each_with_object({}) do |g,h|
h.update([g["dependency"],g["repo"]]=>g) do |_,o,n|
n["version"] > o["version"] ? n : o
end
end.values
#=> [{"dependency"=>"websocket", "version"=>"2.8.0", "repo"=>"repo1"},
# {"dependency"=>"rails", "version"=>"6.2.0", "repo"=>"repo2"},
# {"dependency"=>"httparty", "version"=>"6.1.3.2", "repo"=>"repo2"},
# {"dependency"=>"rails", "version"=>"6.1.0", "repo"=>"repo3"},
# {"dependency"=>"metasploit", "version"=>"2.8.0", "repo"=>"repo3"}]
的接收者values可以看出如下。
{["websocket", "repo1"] =>{"dependency"=>"websocket", "version"=> "2.8.0", "repo"=>"repo1"},
["rails", "repo2"] =>{"dependency"=>"rails", "version"=> "6.2.0", "repo"=>"repo2"},
["httparty", "repo2"] =>{"dependency"=>"httparty", "version"=>"6.1.3.2", "repo"=>"repo2"},
["rails", "repo3"] =>{"dependency"=>"rails", "version"=> "6.1.0", "repo"=>"repo3"},
["metasploit", "repo3"]=>{"dependency"=>"metasploit", "version"=> "2.8.0", "repo"=>"repo3"}}
有關三個塊變數的描述,請參閱檔案:(_公共鍵,這里是一個下劃線,表示它未用于塊計算),o正在構造的散列中的公共鍵的值(想想“舊”) , 和n,正在合并的散列中的公共鍵的值(想想“新”)。
uj5u.com熱心網友回復:
問題是通過使用解決的:
old_hash.group_by {|h| h.values_at("dependency","repo")}.map {|_,v| v.max_by {|h| Gem::Version.new(h["version"])}}
感謝@engineersmnky。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/342924.html
下一篇:Ruby/Rails迭代哈希陣列
