You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:47:47