过滤以从数组中排除元素

Ric*_*h_F 14 ruby arrays

试图从数组中过滤一些条目.它不能保证它们在主数组中,因此我正在通过迭代进行测试.

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
Run Code Online (Sandbox Code Playgroud)

这不起作用.有没有更好的方法来提供这种过滤器?

The*_*e F 25

Ruby允许您在两个数组上使用公共实例方法来获取它们的交叉或独占元素:

a1 = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
a2  = ['charlie', 'echo']
puts a1 - a2
=>  ['alpha', 'bravo', 'delta']

puts a1 & a2
=>  ['charlie', 'echo']
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请检查rubydoc Array.你可能会在那里找到你需要的东西.


M-D*_*hab 11

.select/reject怎么样?还是变异版本.select!/ reject!

这是文档

用法:

[0, 1, 2, 3].select { |x| x > 1 }
# output: [2, 3]
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

excluded = [0, 1]
[0, 1, 2, 3].reject { |x| excluded.include?(x) }
# output: [2, 3]
Run Code Online (Sandbox Code Playgroud)


Mar*_*n13 11

数组#排除(Rails 6+)

如果您使用 Rails(或独立的 ActiveSupport),从版本 6 开始,有一个Array# exclude方法,该方法返回不包括指定元素的数组副本。

["David", "Rafael", "Aaron", "Todd"].excluding("Aaron", "Todd") # => ["David", "Rafael"]
[ [ 0, 1 ], [ 1, 0 ] ].excluding([ [ 1, 0 ] ]) # => [ [ 0, 1 ] ]
Run Code Online (Sandbox Code Playgroud)

因此,您的示例可以改写如下:

["David", "Rafael", "Aaron", "Todd"].excluding("Aaron", "Todd") # => ["David", "Rafael"]
[ [ 0, 1 ], [ 1, 0 ] ].excluding([ [ 1, 0 ] ]) # => [ [ 0, 1 ] ]
Run Code Online (Sandbox Code Playgroud)


tom*_*ave 8

你的代码适合我.至于"更好的方式",你可以使用Array#reject:

total = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
hide = ['charlie', 'echo']

pick = total.reject do |i|
  hide.include?(i)
end
puts pick
Run Code Online (Sandbox Code Playgroud)

它不仅更具惯用性,而且Ruby的for i in collection循环也是以实现的方式实现的collection.each { |i| }.带块的方法几乎总是更好的选择.