当前位置:  开发笔记 > 后端 > 正文

没有重复的Ruby合并数组然后使用更高的重复数组值

如何解决《没有重复的Ruby合并数组然后使用更高的重复数组值》经验,为你挑选了2个好方法。

我正在开发一个版本控制系统,其中在多个不同的环境中指定了厨师食谱版本号.

我已经能够使用这种格式将两个环境文件合并在一起 -

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",
}

任何帮助将不胜感激.谢谢



1> Eric Duminil..:

您可以使用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"}


根据[Matz](https://bugs.ruby-lang.org/issues/5574#note-7):_"由于数组并不总是兼容,我不希望通过使数组具有可比性来给出错误的含义.添加<=>对我来说是允许数组排序的现实妥协."_
`version.scan(/\d + /).map(&:to_i)`也可以

2> Andrey Deine..:

哈希#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]) } }


`old` =>`old_val`.很好用`Gem :: Version`!
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有