我有一个 Ruby 数组
[2,4,6,3,8]
我需要删除值为3
的元素,例如
我该怎么做?
编译 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]
tap
:[2, 4, 6, 3, 8].tap { |ary| ary.delete(3) }.count #=> 4
非破坏性地删除第一次出现的内容:
a = [2, 4, 6, 3, 8]
n = a.index 3
a.take(n)+a.drop(n+1)
你也可以进行猴子补丁。我从来不明白为什么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]
value.kind_of(Array)
测试。只需使用 self - Array(value)
即可。 - Sasgorilla如果你有多个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.
delete
和array.delete(3)
在Ruby on Rails控制器中无法正常工作。 - ManiActive Record
方法delete
。 - Mani