散列与具有键作为符号的散列之一合并

时间:2014-09-14 04:46:14

标签: ruby hash

我有像Ruby这样的两个哈希

hash1={"a" = > "b"}
hash2={:a => "c" }

当我在做的时候 hash1.merge!(hash2)我得到结果为

{"a"=>"b", :a=>"c"} 

我希望得到{"a" => "c"}的结果基本上我希望ruby将符号和字符串视为键值相同。

我正在调查Hash类,但找不到任何方法。

问题是如何合并以使上述操作的结果为{“a”=> “C”}。

3 个答案:

答案 0 :(得分:5)

Rails的ActiveSupport gem有stringify_keys(参见:http://apidock.com/rails/Hash/stringify_keys)方法来完成这项工作:

require 'active_support/hash_with_indifferent_access'
hash1 = { "a" => "b" }
hash2 = { :a  => "c" }

hash1.merge(hash2.stringify_keys)
# => { "a" => "c" }

这就是宝石内部(简化)的作用:

class Hash
  def stringify_keys
    {}.tap do |result|
      each_key { |key| result[key.to_s] = self[key] }
    end
  end
end

答案 1 :(得分:2)

您可以将哈希键规范化为相同类型(即to_sto_sym)并合并:

h = lambda { |h| Hash[h.map{ |k,v| [k.to_s, v] }] }
hash1 = h.call(hash1)
hash2 = h.call(hash2)
hash1.merge!(hash2)

或者用速记来定义lambda:

h = -> (h) { Hash[h.map{ |k,v| [k.to_s, v] }] }

答案 2 :(得分:0)

鉴于您要修改hash1(而不是创建新哈希),您可以这样做:

hash1     = { "a" => "b", "d" => "e" }
hash2     = { :a  => "c", :f => "g", :h => "i", "j" => "k" }
stringify = [ :a, :f ]

hash2.each { |k,v| hash1[stringify.include?(k) ? k.to_s : k] = v }
hash1
  #=> {"a"=>"c", "d"=>"e", "f"=>"g", :h=>"i", "j"=>"k"}

如果hash2中符号中的所有键都要转换为字符串:

hash2.each { |k,v| hash1[k.to_s] = v }
hash1
  #=> {"a"=>"c", "d"=>"e", "f"=>"g", "h"=>"i", "j"=>"k"}