【问题标题】:ruby turn a nested array into a hashruby 将嵌套数组转换为哈希
【发布时间】:2015-08-12 05:37:41
【问题描述】:

有没有一种优雅的方式来转换表单的嵌套数组

[["a", 1], ["a", 2], [nil, 3], [nil, 4], ["b", 6], ["b", 8]]

成散列形式

{"a" => [1,2], nil => [3,4], "b" => [6,8]}

【问题讨论】:

    标签: arrays ruby hash enumerable


    【解决方案1】:
    array.each_with_object({}){|a, h| (h[a.first]||=[] )<< a.last }
    

    【讨论】:

      【解决方案2】:
      ary = [['a', 1], ['a', 2], [nil, 3], [nil, 4], ['b', 6], ['b', 8]]
      ary.group_by(&:first).map {|k, v| {k => v.map(&:last)} }
      

      【讨论】:

      • 你的命令的输出是哈希列表,而不仅仅是一个哈希
      【解决方案3】:

      一种方法可能是:

      array = [['a', 1], ['a', 2], [nil, 3], [nil, 4], ['b', 6], ['b', 8]]
      array.each_with_object(Hash.new{|h,k| h[k] = []}) {|a, obj| obj[a.first] << a.last }
      # => {"a"=>[1, 2], nil=>[3, 4], "b"=>[6, 8]}
      

      【讨论】:

        【解决方案4】:

        这是一种方式:

        arr = [["a", 1], ["a", 2], [nil, 3], [nil, 4], ["b", 6], ["b", 8]]
        
        h = Hash.new {|hash, key| hash[key] = []}
        arr.each {|e| h[e[0]] << e[1]}
        p h #=> {"a"=>[1, 2], nil=>[3, 4], "b"=>[6, 8]}
        

        【讨论】:

          【解决方案5】:
          ary = [['a', 1], ['a', 2], [nil, 3], [nil, 4], ['b', 6], ['b', 8]]
          
          ary.group_by(&:first).
          # => { 'a' => [['a', 1], ['a', 2]], nil => [[nil, 3], [nil, 4]], 'b' => [['b', 6], ['b', 8]] }
            map {|k, v| [k, v.map(&:last)] }.
          # => [['a', [1, 2]], [nil, [3, 4]], ['b', [6, 8]]]
            to_h
          # => { 'a' => [1, 2], nil => [3, 4], 'b' => [6, 8] }
          

          【讨论】:

          • 感谢所有建议,我会选择Hash[array.group_by(&amp;:first).map{|k,v| [k, v.map(&amp;:last)]}],因为我认为它是最易读的(?)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-13
          • 2017-11-22
          • 2020-01-30
          • 1970-01-01
          • 2020-12-22
          • 2016-09-14
          相关资源
          最近更新 更多