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

Ruby中的“数组到散列”转换

  •  1
  • retro  · 技术社区  · 14 年前

    我需要改变 ["a", "b", "c", "d"] {:a => {:b => {:c => "d" }}} ?

    有什么想法吗?

    谢谢

    4 回复  |  直到 14 年前
        1
  •  3
  •   jordinl    14 年前

    我喜欢:

    class Array
      def to_weird_hash
        length == 1 ? first : { first.to_sym => last(length - 1).to_weird_hash }
      end
    end
    
    ["a", "b", "c", "d"].to_weird_hash
    

    你怎么认为?

        2
  •  4
  •   Marc-André Lafortune    14 年前

    有趣的

    ruby-1.8.7-p174 > ["a", "b", "c", "d"].reverse.inject{|hash,item| {item.to_sym => hash}}
     => {:a=>{:b=>{:c=>"d"}}}
    
        3
  •  2
  •   John La Rooy    14 年前

    如果你只需要写4个元素,写出来就很容易了(而且可读性也很强)

    >> A=["a", "b", "c", "d"]
    => ["a", "b", "c", "d"]
    >> {A[0].to_sym => {A[1].to_sym => {A[2].to_sym => A[3]}}}
    => {:a=>{:b=>{:c=>"d"}}}
    

    否则,这将适用于可变长度数组

    >> ["a", "b", "c", "d"].reverse.inject(){|a,e|{e.to_sym => a}}
    => {:a=>{:b=>{:c=>"d"}}}
    >> ["a", "b", "c", "d", "e", "f"].reverse.inject(){|a,e|{e.to_sym => a}}
    => {:a=>{:b=>{:c=>{:d=>{:e=>"f"}}}}}
    
        4
  •  0
  •   retro    14 年前

    我在IRC的帮助下找到了答案。

    x = {}; a[0..-3].inject(x) { |h,k| h[k.to_sym] = {} }[a[-2].to_sym] = a[-1]; x
    

    def nest(a)
      if a.size == 2
        { a[0] => a[1] }
      else
        { a[0] => nest(a[1..-1]) }
      end
    end