2017-03-10 80 views
-1

我有數組的數組,每組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"] 
      } 
} 

很抱歉,如果任意t的他的語法不正確或無效的Ruby,我是新的,不知道如何正確地格式化。

+1

您的預期結果一團糟。 – sawa

+0

請編輯,以使您想要的結果成爲一個有效的Ruby對象。 –

+0

是的,我很抱歉格式化,@ CarySwoveland的答案的輸出正是我之前所做的,所以我已經編輯並將其合併。希望這更有意義。 – 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"]