如何通过值从数组中删除一个元素

426

我有一个 Ruby 数组

[2,4,6,3,8]

我需要删除值为3的元素,例如

我该怎么做?


我想知道为什么deletearray.delete(3)在Ruby on Rails控制器中无法正常工作。 - Mani
2
可能是由于Active Record方法delete - Mani
2
问题的标题和正文是矛盾的。你的目标是删除一个具有给定值的元素,就像标题所暗示的那样吗?还是你的目标是删除所有具有给定值的元素,就像正文所暗示的那样?这两个目标是互斥的;每个目标都有不同的解决方案。 - Ben Amos
15个回答

8

编译 Ruby 中有关删除的不同选项

delete - 通过值删除匹配元素。如果有多个值匹配,它将删除所有匹配项。如果您不关心出现次数或确定只有单个出现,则使用此方法。

a = [2, 6, 3, 5, 3, 7]
a.delete(3)  # returns 3
puts a       # return [2, 6, 5, 7]

delete_at - 删除给定索引处的元素。如果您知道索引,请使用此方法。

# continuing from the above example
a.delete_at(2) # returns 5
puts a         # returns [2, 6, 7]

delete_if - 如果块返回true,则删除每个元素。 这将修改该数组。 随着调用块,数组会立即发生更改。

b = [1, 2, 5, 4, 9, 10, 11]
b.delete_if {|n| n >= 10}.  # returns [1, 2, 5, 4, 9]

reject - 返回一个新的数组,其中包含给定块为假的元素。保持原始数组的顺序。

c = [1, 2, 5, 4, 9, 10, 11]
c.reject {|n| n >= 10}.  # returns [1, 2, 5, 4, 9]

reject! - 与delete_if相同。数组在调用块时可能不会立即改变。

如果你想从数组中删除多个值,最好的选择如下:

a = [2, 3, 7, 4, 6, 21, 13]
b = [7, 21]
a = a - b    # a - [2, 3, 4, 6, 13]

7
如果您还希望将此删除操作链接起来,以便可以删除一些项目并继续在结果数组上链接操作,请使用tap
[2, 4, 6, 3, 8].tap { |ary| ary.delete(3) }.count #=> 4

4

非破坏性地删除第一次出现的内容:

a = [2, 4, 6, 3, 8]
n = a.index 3
a.take(n)+a.drop(n+1)

4

你也可以进行猴子补丁。我从来不明白为什么Ruby为Hash提供了except方法,但却没有为Array提供:

class Array
  def except value
    value = value.kind_of(Array) ? value : [value]
    self - value
  end
end

现在您可以做以下事情:
[1,3,7,"436",354,nil].except(354) #=> [1,3,7,"436",nil]

或者:

[1,3,7,"436",354,nil].except([354, 1]) #=> [3,7,"436",nil]

1
你不需要进行 value.kind_of(Array) 测试。只需使用 self - Array(value) 即可。 - Sasgorilla
我认为这个方法非常复杂。请尝试简化你的代码。 - Syamlal

3

如果你有多个3,并且只想删除第一个出现的3,可以按照以下方式进行操作。

arr = [2, 4, 6, 3, 8, 10, 3, 12]

arr.delete_at arr.index 3

#This will modify arr as [2, 4, 6, 8, 10, 3, 12] where first occurrence of 3 is deleted. Returns the element deleted. In this case => 3.

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