2014-09-30 13 views
23

Jestem nowy w Ruby i utknąłem z tym problemem. Powiedzmy, że mam tablicę takich jak to:Usuń zero i pusty ciąg w tablicy w Ruby

arr = [1, 2, 's', nil, '', 'd'] 

i chcę usunąć nil i pusty ciąg od niego, czyli końcowy tablica powinna być:

arr = [1, 2, 's', 'd'] 

Próbowałem compact ale daje to:

arr.compact! 
arr #=> [1, 2, 's', '', 'd'] doesn't remove empty string. 

Zastanawiam się, czy istnieje inteligentny sposób robienia tego w Ruby.

+0

Sprawdziłem, nie ma zero, jak usunąć zero i pusty ciąg w tym samym czasie. Jak to duplikować? –

+0

puste? zwraca true zarówno dla zera, jak i dla '' (jak również dla innych rzeczy, takich jak '/ n'). [Link do Dokumentów] (http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F) –

+2

Tak, 'puste?' Działa, ale nie jest dostępne w prostym Ruby. Pochodzi z Railsami. – awendt

Odpowiedz

32

Można to zrobić:

arr.reject { |e| e.to_s.empty? } #=> [1, 2, "s", "d"] 

Uwaga nil.to_s => ''.

Jeśli arr może zawierać inny rodzaj pustego obiektu (na przykład, tablicy lub hash), które chcesz zachować, zmienić e.to_s.empty? do e.to_s == ''

+0

Przyznaję, że wysłałem to za czynnik słodkości, ale chcę wyznać, że w prawdziwym życiu chciałbym pójść z odpowiedzią @ awendta. –

20

Ponieważ chcesz usunąć zarówno nil i pustych strun, to nie jest duplikatem How do I remove blank elements from an array?

Chcesz użyć .reject:

arr = [1, 2, 's', nil, '', 'd'] 
arr.reject { |item| item.nil? || item == '' } 

UWAGA:reject i bez huk zachowuje w ten sam sposób jak compact zi bez bang: reject! i compact! modyfikować samą tablicę podczas gdy reject i compact zwróć kopię tablicy i pozostaw oryginał bez zmian.

Jeśli używasz Railsów, możesz również użyć blank?. Został on specjalnie zaprojektowany do pracy na nil, więc staje się wywołanie metody:

arr.reject { |item| item.blank? } 
+2

Integer nie odpowiada na 'pusty?' – xlembouras

+0

Oh. Masz całkowitą rację. Dzięki za wskazanie tego. Zaktualizowałem odpowiedź. – awendt

+0

nie może przegłosować ze względu na niską reputację, ale jest to również dobra odpowiedź. Również dziękuję za cynk, ale na razie nie używam Railsów. :) –

0

Uwaga: Zastanawiam tablica może mieć łańcuch z białych plam w nim.

można zrobić:

arr = [1, 2, 's', nil, ' ', 'd'] 
arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '') == '') } 
#=> [1, 2, "s", "d"] 

czyli

arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '').empty?) } 
#=> [1, 2, "s", "d"] 

lub jeśli chcesz zaktualizować arr sam obiekt, a następnie:

arr.reject!{|a| a.nil? || (a.to_s.gsub(' ', '') == '') } # notice the ! mark, it'll update the object itself. 
p arr #=> [1, 2, "s", "d"] 
+0

dobry przypadek użycia, utrzymam ten umysł, jeśli natknę się na taką sytuację w przyszłości. dzięki. –

0

to wypróbować:

[1, 2, "s", nil, "", "d"].compact.select{|i| !i.to_s.empty?} 
+1

Możesz rozważyć użycie 'reject', zamiast' select', bota, aby pozbyć się '!', A ponieważ 'compact' jest także formą odrzucenia. Dla mnie "odrzuć to i odrzuć to" brzmi lepiej niż "odrzuć to i wybierz". –

1

Można użyć metody zwartą i delete_if usunąć nil i pusty ciąg w tablicy w Ruby

arr = [1, 2, 's', nil, '', 'd'] 
arr.compact!.delete_if{|arrVal| arrVal.class == String and arrVal.empty?} 
=> [1, 2, "s", "d"] 
2

Można użyć kompaktowy z odrzucić

arr = [1, 2, 's', nil, '', 'd'] 
arr = [1, 2, 's', 'd'] 

arr = arr.compact.reject { |h| h == "" } 

lub

arr = arr.compact.delete_if { |h| h == "" } 
2

Możesz również użyć -, aby usunąć wszystkie nil i '' elementy:

arr -= [nil, ''] 
#=> [1, 2, "s", "d"] 

Demonstration

Albo compact i reject ze skrótu (w przypadku, gdy nie używasz Rails, gdzie można po prostu użyć arr.reject(&:blank?)):

arr = arr.compact.reject(&''.method(:==)) 
#=> [1, 2, "s", "d"] 

Demonstration

0

Nadzieję, że to będzie działać w Twoim przypadku:

arr = [1, 2, 's', nil, '', 'd'] 
arr.select{|x| x.to_s!="" } 
0

I pewnie dodać .strip celu wyeliminowania potencjalnych bóle głowy białymi znakami (zakładając, że jej nie app szyn).

array = [1, 2, "s", nil, "  ", "d", "\n"] 
array.reject!{|a| a.nil? || (a.to_s.strip.empty?) } 

#=> [1, 2, "s", "d"] 
5

staram się zrobić:

arr = [1, 2, 's', nil, '', 'd'] 
arr.reject(&:blank?) 

Powroty:

=> [1, 2, "s", "d"] 
-1

arr.reject(&:blank?)

prostu użyć tego, nie trzeba niczego innego.

+0

'blank' nie jest metodą Ruby, jest to Rails, więc powinieneś dodać potrzebną bibliotekę active_support, a pytanie otagowało Ruby, a nie Railsy. Tak czy inaczej, ta odpowiedź wskazuje na coś wskazywanego wcześniej. –