2017-07-07 154 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"}]