ruby - remove element from hash based on pattern -
i have hash looks this:
{ "cell_number" => 1234567, "lead source" => [ "referrel", "web", "ad" ], "lead source_selected" => "web" }
now if there pattern key contains "x_selected", want return entire hash, except x key. in case want return "lead source":
{ "cell_number" : 1234567, "lead source_selected" : "web" }
my attempt seems work:
h = { "cell_number" => 1234567, "lead source" => [ "referrel", "web", "ad" ], "lead source_selected" => "web" } h.collect |k,v| if k =~ /(.+)_selected$/ h.delete( $1 ) end end => [nil, nil, ["referrel", "web", "ad"]] > h => {"cell_number"=>1234567, "lead source_selected"=>"web"}
but there more ruby way this?
a straightforward solution:
h = { "cell_number" => 1234567, "lead source" => [ "referrel", "web", "ad" ], "lead source_selected" => "web" } bad_keys = h.each_with_object([]) |(k,_),a| prefix = k[/(.+)(?=_selected$)/] << prefix if prefix end #=> ["lead source"] h.reject { |k,_| bad_keys.include?(k) } #=> {"cell_number"=>1234567, "lead source_selected"=>"web"}
note uses hash#reject (not enumerable#reject). (?=_selected$)
in regex positive lookahead. h
not mutated.
Comments
Post a Comment