Ruby实现:保留最高版本的唯一哈希数组
嘿,这里有几个实用的Ruby方案能帮你搞定这个需求——把重复的依赖记录按dependency+repo分组,只保留每组里版本最高的那条。咱们直接看代码和思路:
方案一:分组后筛选最高版本(直观易读)
这种方法逻辑清晰,适合刚接触Ruby的开发者理解:
require 'rubygems/version' # 你定义的版本比较方法可以直接用,或者后面直接用Gem::Version的比较 def version_greater?(version1, version2) Gem::Version.new(version1) > Gem::Version.new(version2) end 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和repo的记录归为一组 grouped_records = old_hash.group_by { |record| [record["dependency"], record["repo"]] } # 第二步:每组里挑出版本最高的那条 unique_hash = grouped_records.values.map do |group| # 用max_by直接基于Gem::Version取最大值,比调用自定义方法更简洁 group.max_by { |item| Gem::Version.new(item["version"]) } # 如果你一定要用自己的version_greater?方法,可以换成下面这句: # group.sort { |a, b| version_greater?(b["version"], a["version"]) }.first end # 输出结果 p unique_hash
方案二:单遍历构建结果(性能更优)
如果你的依赖数组很大,这种只遍历一次的方法效率更高:
require 'rubygems/version' def version_greater?(version1, version2) Gem::Version.new(version1) > Gem::Version.new(version2) end 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"} ] unique_hash = old_hash.each_with_object({}) do |current_item, result_hash| # 用dependency+repo的组合作为唯一键 key = [current_item["dependency"], current_item["repo"]] # 如果键不存在,或者当前项版本更高,就更新结果哈希 if !result_hash.key?(key) || version_greater?(current_item["version"], result_hash[key]["version"]) result_hash[key] = current_item end end.values # 提取哈希里的所有值,就是最终的唯一数组 p unique_hash
小提醒
- 别忘了开头加
require 'rubygems/version',不然Gem::Version会报错。 - Ruby 3.0+的哈希是有序的,但分组或遍历后的结果顺序不一定和原数组完全一致,如果必须严格保持原数组中最高版本记录的出现顺序,可以在方案二的基础上调整(比如用数组记录已处理的键,最后按顺序提取),不过大部分场景下不需要纠结这个,只要记录正确就好。
内容的提问来源于stack exchange,提问作者ivey221
相关产品推荐
相关产品推荐

