2017-03-10 11 views
-1

Iは、配列の配列を有し、3つの値からなるそれぞれ、マージアレイ - Ruby on Railsの

[owner, registered_user, license_type] 

ここでいくつかのサンプルデータです:

[["john", "john", "drivers license"],["john", "john", "boat license"], 
["john", "ryan", "drivers license"], ["john", "ryan", "boat license"], 
["Sam", "Sam", "drivers license"],["Sam", "Sam", "boat license"], 
["Sam", "Tim", "drivers license"], ["Sam", "Tim", "boat license"]] 

私が探してい

=> { "john"=>{ 
      "john"=>["drivers license", "boat license"], 
      "ryan"=>["drivers license", "boat license"] 
      }, 
    "Sam" =>{ 
      "Sam" =>["drivers license", "boat license"], 
      "Tim" =>["drivers license", "boat license"] 
      } 
} 

申し訳トンのいずれかの場合:重複を削除し、このようなもので終わるためにこのデータをマージするいくつかの方法彼は構文的に間違っているか、または無効なRubyです。私は新しくこれを正しくフォーマットする方法がわかりません。

+1

あなたの予想どおりの結果が表示されます。 – sawa

+0

編集して、目的の結果に有効なRubyオブジェクトを作成してください。 –

+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええ、これはもっと理にかなってほしい。 – Justin

答えて

0

再帰を使用することで、任意の数のネストされたレベルを持つことができます。私は最初、結果をネストされた配列と仮定しました。

戻るネストされた配列

def rearrange(arr) 
    return arr.flatten if arr.first.size == 1 
    arr.group_by(&:first).map { |f,a| [f, rearrange(a.map { |b| b.drop 1 })] } 
end 

arr = [["john", "john", "drivers license"], ["john", "john", "boat license"], 
     ["john", "ryan", "drivers license"], ["john", "ryan", "boat license"], 
     ["Sam", "Sam", "drivers license"], ["Sam", "Sam", "boat license"], 
     ["Sam", "Tim", "drivers license"], ["Sam", "Tim", "boat license"]] 

rearrange arr 
    #=> [ 
    #  ["john", [ 
    #    ["john", ["drivers license", "boat license"]], 
    #    ["ryan", ["drivers license", "boat license"]] 
    #    ] 
    #  ], 
    #  ["Sam", [ 
    #    ["Sam", ["drivers license", "boat license"]], 
    #    ["Tim", ["drivers license", "boat license"]] 
    #    ] 
    #  ] 
    # ] 

戻り

OPはそれが簡単に情報を抽出することになるだろうハッシュを返す検討すべきであるネストされたハッシュ。これは再帰を使って次のように行うことができます。

def rearrange(arr) 
    return arr.flatten if arr.first.size == 1 
    h = arr.group_by(&:first) 
    h.each_key { |k| h[k] = { |_,a| [f, rearrange(a.map { |b| b.drop 1 })] } 
end 

h = rearrange(arr) 
    #=> { "john"=>{ 
    #    "john"=>["drivers license", "boat license"], 
    #    "ryan"=>["drivers license", "boat license"] 
    #    }, 
    #  "Sam" =>{ 
    #    "Sam" =>["drivers license", "boat license"], 
    #    "Tim" =>["drivers license", "boat license"] 
    #    } 
    # } 

ハッシュを返すことで、目的のデータを簡単に取得できます。たとえば、

h["Sam"]["Tim"] 
    #=> ["drivers license", "boat license"]