我正在开发一个版本控制系统,其中在多个不同的环境中指定了厨师食谱版本号.
我已经能够使用这种格式将两个环境文件合并在一起 -
source = JSON.parse(File.read("A.json")) destination = JSON.parse(File.read("B.json")) source = destination.merge(source)
每个文件的值都采用以下格式 -
'一个'
{ "a": "v2.0.18", "b": "v5.0.2", "c": "v17.0.0", "d": "v9.0.0", }
'B'
{ "a": "v1.0.18", "b": "v4.0.0", "c": "v20.0.0", "d": "v7.0.0" }
目前做 -
{ "a": "v2.0.18", "b": "v5.0.2", "c": "v17.0.0", "d": "v9.0.0", }
我想要它做什么 -
{ "a": "v2.0.18", "b": "v5.0.2", "c": "v20.0.0", #keeps higher value "d": "v9.0.0", }
任何帮助将不胜感激.谢谢
您可以使用Hash#merge
,但您还需要定义如何在两个字符串之间进行比较.
major_minor
转换"v2.0.18"
为[2,0,18]
,可以与其他版本数组进行比较以找到最大值.
source = { "a": "v2.0.18", "b": "v5.0.2", "c": "v17.0.0", "d": "v9.0.0", } destination = { "a": "v1.0.18", "b": "v4.0.0", "c": "v20.0.0", "d": "v7.0.0" } def major_minor(version) version.scan(/\d+/).map(&:to_i) end p source.merge(destination){|key, old, new| [old, new].max_by{|v| major_minor(v) } } #=> {:a=>"v2.0.18", :b=>"v5.0.2", :c=>"v20.0.0", :d=>"v9.0.0"}
哈希#merge
是你正在寻找的:
a.merge(b) do |key, old_val, new_val| Gem::Version.new(old_val[1..-1]) > Gem::Version.new(new_val[1..-1]) ? old_val : new_val end #=> {:a=>"v2.0.18", :b=>"v5.0.2", :c=>"v20.0.0", :d=>"v9.0.0"}
正如@Stefan建议的那样,通过结合@Eric Duminil 在他的回答中 使用的方法可以改善上述内容:
a.merge(b) { |key, *values| values.max_by { |v| Gem::Version.new(v[1..-1]) } }