2017-07-07 152 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

還有一個問題 - 使用'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] } 

刪除y到位不合格的元素或扭轉與.delete_if邏輯:

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

所有產品:

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