Respostas:
Existem muitas maneiras de fazer isso, uma é reject
noEmptyCities = cities.reject { |c| c.empty? }
Você também pode usar reject!, que será modificado citiesno local. Ele retornará citiescomo seu valor de retorno se rejeitar alguma coisa ou nilse nenhuma rejeição for feita. Isso pode ser um problema, se você não tomar cuidado (obrigado a ninja08 por apontar isso nos comentários).
cities.reject!(&:blank?)? empty?é para matrizes
blank?está disponível apenas através ActiveSupport. Padrão Ruby faz uso String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
rejecté melhor do que reject!porque [].reject!(&:empty?)retornos nil, [].reject(&:empty?)retornos[]
Aqui está o que funciona para mim:
[1, "", 2, "hello", nil].reject(&:blank?)
resultado:
[1, 2, "hello"]
:blank?é específico do Rails.
NoMethodError: undefined method empty? for nil:NilClass, :blank? é melhor que:empty?
:blankfunciona melhor que :empty. Porque :emptynão funciona paranil
Quando eu quero arrumar uma matriz como esta, eu uso:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Isso removerá todos os elementos em branco ou nulos.
cities.delete_if(&:blank?)
Isso removerá os nilvalores e os valores vazios de string ( "").
Por exemplo:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Tente o seguinte:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Use reject:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?),.
nil.empty?booom break!
reject(&:empty?)com, compactpor exemplo,[nil, ''].compact.reject(&:empty?)
cities.reject! { |c| c.blank? }
O motivo pelo qual você deseja usar blank?mais empty?é que o espaço em branco reconhece nada, cadeias vazias e espaços em branco. Por exemplo:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
ainda retornaria:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
E chamando empty?no " "retorno vontade false, que você provavelmente vai querer ser true.
Nota: blank?só é acessível através do Rails, o Ruby suporta apenas empty?.
Já existem muitas respostas, mas aqui está outra abordagem, se você estiver no mundo do Rails:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
present?vem de ActiveSupport. Isso tem uma tag no Rails, e exigir uma gema extra para um método parece excessivo.
Aqui está mais uma abordagem para alcançar esse objetivo.
nós podemos usar presencecomselect
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
" "elementos em minha matriz que não foram removidos com o método rejeitar. Seu método removido nil ""ou " "itens.
Você pode tentar isso
cities.reject!(&:empty?)
cities.reject!(&:blank?)
Maneira mais curta cities.select(&:present?)
outro método:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
Atualize com um rigoroso com join&split
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
O resultado será:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Observe que: isso não funciona com uma cidade com espaços
cities.reject!(&:empty?)