【问题标题】:Clone specific attributes of array of hashes克隆哈希数组的特定属性
【发布时间】:2016-01-18 22:26:32
【问题描述】:

我需要一些关于克隆哈希属性的帮助。 我有 X 个哈希(当前为 2)的数组 A,B:

A = [
  {"v1"=>{"description"=>"abc", "export_value"=>"2"}},
  {"v2"=>{"description"=>"cba", "export_value"=>"2"}}
]

B = [ 
  {"v1"=>{"description"=>"", "export_value"=>"3"}},
  {"v2"=>{"description"=>"", "export_value"=>"5"}}
]

在 Ruby 中是否有任何方法(某些函数或任何东西)可以将某些属性从一个哈希克隆到另一个哈希。

例如,我想将“export_values”属性从数组B 克隆到A,因此最终的哈希数组如下所示:

C = [
  {"v1"=>{"description"=>"abc", "export_value"=>"3"}},
  {"v2"=>{"description"=>"cba", "export_value"=>"5"}}
]

【问题讨论】:

  • 数组A,B 是否确定并保证始终具有相同数量的元素?如果他们不这样做,应该使用什么值?它会保持原来的export_value 来自A 还是变成nil?
  • 数组具有相同数量的元素和相同的属性,只是哈希键的值不同@MichaelBerkowski

标签: arrays ruby hash


【解决方案1】:

你可以这样做:

A.map.with_index do |h, i| 
    h.merge(B[i]) do |_, hash_from_A, hash_from_B| 
        hash_from_A.merge(hash_from_B) do |k, o, n|
            k == "export_value" ? n : o
        end
    end
end

#=> [{"v1"=>{"description"=>"abc", "export_value"=>"3"}},
#    {"v2"=>{"description"=>"cba", "export_value"=>"5"}}]

如果您的应用可以访问 Rails Active Support gem,那么您可以使用 Hash#deep_merge 稍微简化上述代码。

require "active_support/core_ext/hash"

A.map.with_index do |h, i| 
    h.deep_merge(B[i]) do |k, o, n|
        k == "export_value" ? n : o
    end
end

【讨论】:

  • 是的,我确实使用导轨。谢谢,这有帮助!你能解释一下什么是“k”、“o”、“n”吗?如果所有其他属性都不相同,我正在尝试输入验证以返回 false 所以不合并。只有“export_value”在“A”和“B”哈希中可以不同。所以请解释一下,谢谢!
  • 合并两个散列时,如果两个散列中都存在一个键,则调用块,以便您可以决定如何解析该键的新值。要阻止的参数是键、旧值和新值。 “旧值”是哈希中调用合并的键的值,“新值”是哈希中键的值,作为参数传递给合并方法。 docs.ruby-lang.org/en/2.0.0/Hash.html#method-i-merge
猜你喜欢
  • 2011-02-07
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2013-12-19
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
相关资源
最近更新 更多