代码之家  ›  专栏  ›  技术社区  ›  holden

如何简单地将哈希合并为新的哈希?

  •  2
  • holden  · 技术社区  · 16 年前
    I have a simple hash like so { "1234" => "5", "2345" => "6" }
    

    如何创建一个同时包含键和值的新哈希?像这样:

    { key_id = "1234", value_id = "5" }, { key_id = "2345", value_id = "6" }
    
    4 回复  |  直到 16 年前
        1
  •  6
  •   Codebeef    16 年前

    你到底想用这个实现什么?如果要遍历所有键,可以使用.keys:

    h = { "1234" => "5", "2345" => "6" }
    h.keys
    => ["1234", "2345"]
    

    如果您只想创建一个哈希数组,那么应该能够迭代键:

    h = { "1234" => "5", "2345" => "6" }
    a = []
    
    h.each {|k, v| a << {:key_id => k, :value_id => v}
    
        2
  •  1
  •   cgmack    16 年前

    通过“合并”两个散列,我认为您的意思是将两个不同散列的所有内容放入一个新的散列中。因为哈希的键必须是唯一的,所以如果两个源哈希中都存在相同的键,那么只有一个值可以生存。

    在本例中,我将哈希X和哈希Y的内容合并到哈希Z中。如果有重复的键,Y中的值将覆盖Z中的值。

    x = { "a" => "1","b" => "2","c" => "3" }
    y = { "c" => "999","d" => "4","e" => "5" }
    z = {}
    
    x.each do |key,value|
      z[key] = value
    end
    
    y.each do |key,value|
      z[key] = value
    end
    

    源哈希总共有6个键。因为键“c”在两个hase中,合并的哈希只有5个键。

    => {"a"=>"1", "b"=>"2", "c"=>"999", "d"=>"4", "e"=>"5"}
    
        3
  •  0
  •   Michael Sepcot    16 年前

    您可以循环遍历每对原始哈希并构建一个哈希数组:

    hashes = []
    { "1234" => "5", "2345" => "6" }.each_pair {|key, value| hashes << { :key_id => key, :value_id => value } }
    

    收益率:

    [{:key_id=>"2345", :value_id=>"6"}, {:key_id=>"1234", :value_id=>"5"}]
    
        4
  •  0
  •   amarillion    16 年前

    派生哈希的键应该是什么,与原始哈希相同?在这种情况下,请使用以下代码段:

    x = { "1234" => "5", "2345" => "6" }
    y = {}
    
    x.each do |key, value|
        y[key] = { "key_id" => key, "value_id" => value }
    end