2013-07-27 2 views
6

У меня вопрос очень простой: Как удалить первый элемент по значению в массиве. Например:удалить один элемент массива по значению в ruby ​​

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] 

я не нашел ничего подобного, может кто-нибудь мне помочь?

Заранее спасибо

ответ

16

Передайте результат 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() переменной и использовать эту переменную в delete_at(), если это не nil. Правая сторона && не будет выполняться вообще, если левая сторона равна false или nil.

>> (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] 
+0

Вы должны проверить, что аргумент 'find_index' включен в массив, иначе' delete_at' вызывает 'TypeError', потому что его аргумент' nil'. – toro2k

+0

@ toro2k Действительно. Альтернатива, добавленная выше, которая позволяет избежать TypeError –

+2

. Более компактным способом может быть 'arr.delete_at (arr.index (3) || arr.size)'. – toro2k

-8

Вы также можете использовать :- оператор удалить нужный элемент из массива, например .:

$> [1, 2, 3, '4', 'foo'] - ['foo'] 
$> [1, 2, 3, '4'] 

Надеется, что это помогает.

+0

грустно это удалит все экземпляры 'foo' из массива –

+0

'x = [1, 1]; x - [1] # => [] '. Это не отвечает на вопрос, который должен был явно * «удалить ** ONE ** элемент массива по значению» *. –