Ruby - 根据另一个数组过滤哈希数组

5
我正在尝试根据另一个数组筛选哈希数组。如何最好地完成这个任务?以下是我目前的两种方法:
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"}]


你想要什么样的输出? - Mark Thomas
@MarkThomas 更新了。 - linuxNoob
3个回答

7

如果你想要仅选择值为:dis包含在x中的元素:

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

简单明了,谢谢!我不知道 include? - linuxNoob
只有一个问题 - 使用 select! 是不是一个坏主意?将其存储并重新使用是否更好?我不需要在其他地方使用 y - linuxNoob
我能想到的唯一改进就是用“包含”代替“包括”,这样它就是“...选择...包含...”。 - Cary Swoveland
1
哈哈 @CarySwoveland 我也是这么想的,只是没来得及更新。很高兴遇到一个同样爱挑剔的人!(现在如果我们能让 Ruby 维护者把那些方法变成复数就好了…) - Mark Thomas
1
@linuxNoob 如果你想就地修改它(或者使用keep_if,这对我来说通常更易读),那么使用select!是可以的。 - Mark Thomas

1

您可以使用 .keep_if 在原址上删除 y 中不符合条件的元素。

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

或者使用.delete_if来反转逻辑。
> y.delete_if { |h| !x.include? h[:dis] }

所有产品:
> y
=> [{:dis=>2, :as=>"li"}]

0

是的使用 select,不过这里还有另一种方法可行:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接