代码之家  ›  专栏  ›  技术社区  ›  Fredrik Boström

在Ruby中重新映射哈希的最佳方法是什么?

  •  3
  • Fredrik Boström  · 技术社区  · 16 年前

    是否有一种简单的方法可以用Ruby重新映射哈希,方法如下:

    来自:

    {:name => "foo", :value => "bar"}
    

    到:

    {"foo" => "bar"}
    

    最好是在迭代此类哈希数组时简化此操作:

    来自:

    [{:name => "foo", :value => "bar"}, {:name => "foo2", :value => "bar2"}]
    

    到:

    {"foo" => "bar", "foo2" => "bar2"}
    

    谢谢。

    5 回复  |  直到 16 年前
        1
  •  9
  •   Gishu    16 年前
    arr = [ {:name=>"foo", :value=>"bar"}, {:name=>"foo2", :value=>"bar2"}]
    
    result = {}
    arr.each{|x| result[x[:name]] = x[:value]}
    
    # result is now {"foo2"=>"bar2", "foo"=>"bar"}
    
        2
  •  3
  •   Fredrik Boström    16 年前

    范森·塞缪尔代码的修改版本达到了预期的效果。 这是一条单行线,但相当长。

    arr = [{:name=>"foo", :value=>"bar"}, {:name=>"foo2", :value=>"bar2"}]
    
    arr.inject({}){|r,item| r.merge({item['name'] => item['value']})}
    
    # result {"foo" => "bar", "foo2" => "bar2"}
    

    不过,我不会说它比吉斯的版本更漂亮。

        3
  •  1
  •   Bob Aman    16 年前

    一般来说,如果您有一个形式为:name=>“foo”,:value=>“bar”的散列值,则最好使用[“foo”,“bar”]的元组。

    arr = [["foo", "bar"], ["foo2", "bar2"]]
    arr.inject({}) { |accu, (key, value)| accu[key] = value; accu }
    
        4
  •  1
  •   John Carney    13 年前

    我知道这很古老,但实现这一点的最新方法是将哈希数组映射到一个元组数组,然后使用hash[]根据该数组构建哈希,如下所示:

    arr = [{:name => "foo", :value => "bar"}, {:name => "foo2", :value => "bar2"}]
    Hash[ array.map { |item| [ item[:name], item[:value] ] } ]
    
    # => {"foo"=>"bar", "foo2"=>"bar2"}
    
        5
  •  0
  •   runub    9 年前

    晚了一点,但是:

    [{ name: "foo", value: "bar" },{name: "foo2", value: "bar2"}].map{ |k| k.values }.to_h