David N. Welton wrote:
Hi,
foo = { 'a' => 1, 'b' => '', 'c' => 23213 }
bar = Hash[*foo.find_all { |k, v| !v.to_s.empty? }.flatten]
1) The flatten isn't quite what I want, although it will work in my
case.2) Is there an even better way to be doing this? It's starting to be
a lot of stuff in one line, so perhaps it's best to just do it in a
few lines and opt for clarity. But I'm completely new to Ruby, so
I'd also like advice on 'style'...
Dunno whether it's better in this case, but of course there's a solution
with #inject:
foo = { 'a' => 1, 'b' => '', 'c' => 23213 }
=> {"a"=>1, "b"=>"", "c"=>23213}
bar=foo.inject({}){|h,(k,v)| h[k]=v unless v.to_s.empty?; h}
=> {"a"=>1, "c"=>23213}
You can as well use delete_if to modify foo in place:
foo.delete_if {|k,v| v.to_s.empty?}
=> {"a"=>1, "c"=>23213}
foo
=> {"a"=>1, "c"=>23213}
Kind regards
robert