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

要哈希Ruby的数组

  •  181
  • djhworld  · 技术社区  · 14 年前

    好吧,这是交易,我在谷歌上搜索了很久,想找到解决办法,虽然有很多人,但他们似乎没有做我要找的工作。

    基本上我有一个这样的数组

    ["item 1", "item 2", "item 3", "item 4"] 
    

    我想把这个转换成散列,所以看起来像这样

    { "item 1" => "item 2", "item 3" => "item 4" }
    

    即“偶数”索引上的项是键,“奇数”索引上的项是值。

    有什么办法可以干净利落地做到这一点吗?我认为一个蛮力的方法是将所有偶数索引提取到一个单独的数组中,然后循环它们以添加值。

    8 回复  |  直到 14 年前
        1
  •  342
  •   Ben Lee    6 年前
    a = ["item 1", "item 2", "item 3", "item 4"]
    h = Hash[*a] # => { "item 1" => "item 2", "item 3" => "item 4" }
    

    就这样。这个 * 被称为 劈啪声 操作员。

    每个@mike lewis都要注意一点(在评论中):“要非常小心。Ruby在堆栈上展开展开。如果您对一个大数据集执行此操作,那么应该将您的堆栈吹出。”

    所以,对于大多数一般的用例来说,这个方法是很好的,但是如果您想对大量数据进行转换,可以使用不同的方法。例如,@ukasz niemier(也在注释中)为大型数据集提供了这种方法:

    h = Hash[a.each_slice(2).to_a]
    
        2
  •  93
  •   Jochem Schulenklopper    11 年前

    Ruby 2.1.0引入了 to_h 数组上的方法,如果原始数组由键值对数组组成,则执行所需操作: http://www.ruby-doc.org/core-2.1.0/Array.html#method-i-to_h .

    [[:foo, :bar], [1, 2]].to_h
    # => {:foo => :bar, 1 => 2}
    
        3
  •  26
  •   Josh    12 年前

    只是使用 Hash.[] 数组中的值。例如:

    arr = [1,2,3,4]
    Hash[*arr] #=> gives {1 => 2, 3 => 4}
    
        4
  •  24
  •   Erik Escobedo    12 年前

    或者如果你有一个数组 [key, value] 数组,可以执行以下操作:

    [[1, 2], [3, 4]].inject({}) do |r, s|
      r.merge!({s[0] => s[1]})
    end # => { 1 => 2, 3 => 4 }
    
        5
  •  10
  •   Karl Glaser    10 年前

    这是我在谷歌搜索时要找的:

    [{a: 1}, {b: 2}].reduce({}) { |h, v| h.merge v } => {:a=>1, :b=>2}

        6
  •  7
  •   Arup Rakshit    11 年前

    Enumerator 包括 Enumerable . 自从 2.1 , 可枚举的 还有一个方法 #to_h . 所以,我们可以写:

    a = ["item 1", "item 2", "item 3", "item 4"]
    a.each_slice(2).to_h
    # => {"item 1"=>"item 2", "item 3"=>"item 4"}
    

    因为 #each_slice 没有障碍就给了我们 枚举器 根据上面的解释,我们可以 阿尔托 方法 枚举器 对象。

        7
  •  6
  •   Jenorish    10 年前

    您可以这样尝试,对于单个数组

    irb(main):019:0> a = ["item 1", "item 2", "item 3", "item 4"]
      => ["item 1", "item 2", "item 3", "item 4"]
    irb(main):020:0> Hash[*a]
      => {"item 1"=>"item 2", "item 3"=>"item 4"}
    

    用于数组

    irb(main):022:0> a = [[1, 2], [3, 4]]
      => [[1, 2], [3, 4]]
    irb(main):023:0> Hash[*a.flatten]
      => {1=>2, 3=>4}
    
        8
  •  5
  •   Boris Stitnicky    12 年前
    a = ["item 1", "item 2", "item 3", "item 4"]
    Hash[ a.each_slice( 2 ).map { |e| e } ]
    

    或者,如果你讨厌 Hash[ ... ] :

    a.each_slice( 2 ).each_with_object Hash.new do |(k, v), h| h[k] = v end
    

    或者,如果你是一个懒散的功能编程爱好者:

    h = a.lazy.each_slice( 2 ).tap { |a|
      break Hash.new { |h, k| h[k] = a.find { |e, _| e == k }[1] }
    }
    #=> {}
    h["item 1"] #=> "item 2"
    h["item 3"] #=> "item 4"
    
    推荐文章