2017-03-10 6 views
-1

Ich habe ein Array von Arrays, die jeweils drei Werte aus,Merge Array basierend auf bestimmten Elementwert - Ruby on Rails

[owner, registered_user, license_type] 

Hier einige Beispieldaten:

[["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"]] 

Ich suche eine Möglichkeit, diese Daten zu fusionieren die Duplikate zu entfernen und mit etwas am Ende wie folgt:

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

Sorry, wenn jeder von t sein ist syntaktisch falsch oder ungültig Ruby, ich bin neu und nicht sicher, wie man das richtig formatiert.

+1

Ihr erwartetes Ergebnis in einem Durcheinander. – sawa

+0

Bearbeiten Sie, um das gewünschte Ergebnis zu einem gültigen Ruby-Objekt zu machen. –

+0

Ja, tut mir leid wegen der Formatierung, die Ausgabe von @ CarySwovelands Antwort ist genau das, was ich gesucht habe, also habe ich bearbeitet, um das zu integrieren. Ich hoffe, das macht mehr Sinn. – Justin

Antwort

0

Mithilfe der Rekursion kann eine beliebige Anzahl von verschachtelten Ebenen haben. Ich habe anfangs angenommen, dass das Ergebnis ein verschachteltes Array ist.

Rückkehr ein verschachteltes Array

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"]] 
    #    ] 
    #  ] 
    # ] 

Return eine verschachtelte hash

Der OP berücksichtigen sollten einen Hash Rückkehr, die es leichter zu extrahieren Informationen machen würde. Dies kann wie folgt geschehen, wiederum unter Verwendung der Rekursion.

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"] 
    #    } 
    # } 

Durch die Rückgabe eines Hash können Sie einfach Daten von Interesse abrufen. Zum Beispiel

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