在 Ruby 中,如何按值删除一个数组元素

9
如何通过值删除数组中的第一个元素?
arr = [ 1, 1, 2, 2, 3, 3, 4, 5 ] 
#something like:
arr.delete_first(3)
#I would like a result like => [ 1, 1, 2, 2, 3, 4, 5]

提前感谢您

2个回答

22
Array#find_index的结果传递给Array#delete_at方法:
>> arr.delete_at(arr.find_index(3))

>> arr
=> [1, 1, 2, 2, 3, 4, 5]

find_index() 函数将返回数组中第一个匹配其参数的元素的索引。 delete_at() 可以删除指定索引位置上的数组元素。

为了避免 delete_at() 在索引未找到时引发 TypeError 异常,您可以使用 && 构造将 find_index() 的结果赋值给一个变量,如果该变量不是 nil ,则在 delete_at() 中使用该变量。如果左侧为 falsenil,则右侧将不会执行。

>> (i = arr.find_index(3)) && arr.delete_at(i)
=> 3
>> (i = arr.find_index(6)) && arr.delete_at(i)
=> nil
>> arr
=> [1, 1, 2, 2, 3, 4, 5]

你应该检查find_index的参数是否包含在数组中,否则delete_at会引发TypeError异常,因为它的参数是nil - toro2k
@toro2k 确实。已添加替代方案,避免了 TypeError 的问题。 - Michael Berkowski
2
一种更简洁的方式可能是 arr.delete_at(arr.index(3) || arr.size) - toro2k
@toro2k 这就是为什么 Ruby 是一门如此优秀的语言。 - Michael Berkowski
@steenslag 抱歉打错字了.. 我相信 find_index() 和 index() 是彼此的别名。在文档中它们的源代码是相同的。 - Michael Berkowski

-8
您还可以使用:-运算符从数组中删除所需元素,例如:
$> [1, 2, 3, '4', 'foo'] - ['foo']
$> [1, 2, 3, '4']

希望这能有所帮助。

1
遗憾的是,这将从数组中删除所有“foo”的实例。 - Chris Doyle
x = [1, 1]; x - [1] # => []。这并没有回答问题,问题明确要求“通过值删除一个数组元素”。 - Tom Lord

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