2017-07-07 27 views
2

Ich versuche, ein Array von Hashes basierend auf einem anderen Array zu filtern. Was ist der beste Weg, dies zu erreichen? Hier ist die 2 brut Ich habe jetzt:Ruby - Filtern von Arrays von Hashes basierend auf einem anderen Array

x=[1,2,3] 
y = [{dis:4,as:"hi"},{dis:2,as:"li"}] 

1) aa = [] 
x.each do |a| 
    qq = y.select{|k,v| k[:dis]==a} 
    aa+=qq unless qq.empty? 
end 

2) q = [] 
y.each do |k,v| 
    x.each do |ele| 
    if k[:dis]==ele 
     q << {dis: ele,as: k[:as]} 
    end 
    end 
end 

Hier ist die Ausgabe mir die Absicht:

[{dis:2,as:"li"}]

+0

Was ist Ihre gewünschte Ausgabe? –

+0

@MarkThomas aktualisiert – linuxNoob

Antwort

4

Wenn Sie nur die Elemente auswählen mögen, wo der Wert von :dis inbegriffen in x:

y.select{|h| x.include? h[:dis]} 
+0

Einfach und prägnant, danke! Ich wusste nicht über 'include?' – linuxNoob

+0

Nur noch eine Frage - Ist es eine schlechte Idee, 'select!' Zu verwenden, wäre es besser, sie zu speichern und wiederzuverwenden? Ich brauche 'y' nicht woanders. – linuxNoob

+0

Die einzige mögliche Verbesserung, die ich mir vorstellen kann, ist, das Wort "included" durch "contained" zu ersetzen, also heißt es "... select ... included ...". –

0

Ja select verwenden, ist jedoch hier eine andere Art und Weise, die funktioniert:

y.each_with_object([]) { |hash,obj| obj << hash if x.include? hash[:dis] } 
0

Sie können mit mit .keep_if

> y.keep_if { |h| x.include? h[:dis] } 

Oder umgekehrt die Logik mit .delete_if die nicht-konforme Elemente y anstelle löschen:

> y.delete_if { |h| !x.include? h[:dis] } 

Alle Produkte:

> y 
=> [{:dis=>2, :as=>"li"}] 
Verwandte Themen