2017-03-10 79 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"]