2017-07-07 13 views
2

別の配列に基づくハッシュの配列をフィルタリングしようとしています。これを達成する最良の方法は何ですか?ここで私は今きた2獣は以下のとおりです。Ruby - 別の配列に基づくハッシュの配列のフィルタリング

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 

は、ここで私が意図していた出力です:

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

+0

希望する出力は何ですか? –

+0

@MarkThomas更新 – linuxNoob

答えて

4

あなたが:disの値が含まれている要素のみを選択したい場合はxに:

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

シンプルで簡潔な、ありがとう!私は 'include?'について知らなかった – linuxNoob

+0

ちょうどもう1つの質問 - 'select! 'を使うのは悪い考えですか?それを保存して再利用するのが好ましいでしょうか?私はどこにいても「y」は必要ありません。 – linuxNoob

+0

私が考えることができる唯一の可能性のある改善は、 "included"という言葉を "contained"に置き換えることで、 "... select ... included ..."と読み替えることです。 –

0

はいselectを使用し、それにもかかわらず、ここで働く別の方法があります:

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

あなたは.keep_if

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

それとも.delete_ifとの論理を逆転とで所定の位置にyの不適合要素を削除することができます。

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

すべての農産物を:

> y 
=> [{:dis=>2, :as=>"li"}] 
関連する問題