19

如何从数组中删除一些元素并选择它们?

例如:

class Foo 
  def initialize
    @a = [1,2,3,4,5,6,7,8,9]
  end

  def get_a
    return @a
  end
end

foo = Foo.new
b = foo.get_a.sth{ |e| e < 4 }
p b # => [1,2,3]
p foo.get_a # => [4,5,6,7,8,9,10]

我可以用什么代替foo.get_a.sth

4

5 回答 5

32

如果您不需要保留的对象 id a

a = [1,2,3,4,5,6,7,8,9,10]
b, a = a.partition{|e| e < 4}
b # => [1, 2, 3]
a # => [4, 5, 6, 7, 8, 9, 10]

如果确实需要保留 的对象 id a,则使用时间数组c

a = [1,2,3,4,5,6,7,8,9,10]
b, c = a.partition{|e| e < 4}
a.replace(c)
于 2013-07-31T14:41:43.657 回答
3

Rails 6 现在有这个:

a = [1, 2, 3]
#=> [1, 2, 3]
a.extract! { |n| n.even? }
#=> [2]
a
#=> [1, 3] 
于 2021-06-30T23:57:48.743 回答
2

如果您只删除一项,则不需要复制数组等:

array = [{ id: 1 }, { id: 2 }, {id: 3 }]
array.delete_at(array.find_index { |element| element[:id] == 1 })
#=> {:id=>1} 
于 2014-02-24T02:02:09.413 回答
1
a = [1, 2, 3, 4]
a.dup - (a.delete_if(&:even?))
#=> [2, 4]

a
#=> [1, 3]

a = [1, 2, 3, 4]
b = a.dup - (a.delete_if { |e| e < 4 })
a
#=> [4]
b
#=> [1, 2, 3]

编辑:听起来你只是在#select......

a = [1, 2, 3, 4]
a.select { |e| e < 3 }
#=> [1, 2]
于 2013-07-31T14:44:32.790 回答
0

我仍然不相信 ruby​​ 在其默认库中没有此功能。应该有与此等效的#drop 方法。当然,有一个可用的 gem 可以将功能添加到数组类中。但是,当您可以分解自己的脚本时,谁还需要 gem:

#in initializer somewhere
class Array
  def exclude(obj)
    x = self
    x.delete(obj)
    x
  end
end

我可能会为此方法向 ruby​​ github 项目提交拉取请求。到目前为止,这个超人补丁运行良好。

于 2014-04-17T21:21:35.440 回答