尝试从数组中过滤某些条目。它不能保证它们在主数组中,因此我正在通过迭代进行测试。
total = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
hide = ['charlie', 'echo']
pick = []
for i in total
if !hide.include?(i)
puts i
pick.push(i)
end
end
puts pick
这不起作用。有没有更好的方法来提供这种过滤器?
答案 0 :(得分:22)
Ruby允许您在两个数组上使用公共实例方法来获取它们的交叉或独占元素:
a1 = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
a2 = ['charlie', 'echo']
puts a1 - a2
=> ['alpha', 'bravo', 'delta']
puts a1 & a2
=> ['charlie', 'echo']
有关详情,请查看rubydoc Array。您可能会在那里找到您需要的确切内容。
答案 1 :(得分:8)
您的代码适合我。
至于“更好的方式”,您可以使用Array#reject
:
total = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
hide = ['charlie', 'echo']
pick = total.reject do |i|
hide.include?(i)
end
puts pick
不仅是更惯用,而且Ruby的for i in collection
循环是以collection.each { |i| }
实现的。带块的方法几乎总是更好的选择。
答案 2 :(得分:4)
.select
/ reject
怎么样?还是变异版本.select!
/ reject!
?
这里是docs。
用法:
[0, 1, 2, 3].select { |x| x > 1 }
# output: [2, 3]
或者您的情况:
excluded = [0, 1]
[0, 1, 2, 3].reject { |x| excluded.include?(x) }
# output: [2, 3]
答案 3 :(得分:1)
如果您使用的是Rails(或独立的ActiveSupport),则从版本6开始,有一个Array#excluding方法可返回不包含指定元素的数组副本。
["David", "Rafael", "Aaron", "Todd"].excluding("Aaron", "Todd") # => ["David", "Rafael"]
[ [ 0, 1 ], [ 1, 0 ] ].excluding([ [ 1, 0 ] ]) # => [ [ 0, 1 ] ]
因此,您的示例可以重写如下:
total = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
hide = ['charlie', 'echo']
pick = total.excluding(hide)
# => ['alpha', 'bravo', 'delta']