replace values in hash

  • Thread starter Jason Lillywhite
  • Start date
J

Jason Lillywhite

how would I iterate over a hash, such as

x = { 'a' => "hi", 'b' => nil, 'c' => "do"}

and replace nil values with 'foo' then return the hash again?
 
T

Trans

how would I iterate over a hash, such as

x =3D { 'a' =3D> "hi", 'b' =3D> nil, 'c' =3D> "do"}

x.each{ |k,v| x[k] =3D 'foo' unless v }

However, it is not always sane to alter something while you are
iterating over it. So,

h =3D {}
x.each{ |k,v| h[k] =3D v.nil? ? v : 'foo' }
x.replace(h)

Or use Facets Enumerable#mash (alias #graph)

require 'facets/enumerable/mash'

x =3D x.mash{ |k,v| [k, v.nil? ? v : 'foo'] }

http://facets.rubyforge.org/doc/api/core/classes/Enumerable.html#M000429

7.
 
J

Jason Lillywhite

Thank you!

However, I am getting undefined method 'mash' even though I do require
'facets/enumerable/mash'

am I missing something?
 
S

Sarcar, Shourya C (GE Healthcare)

=20
-----Original Message-----
From: (e-mail address removed) [mailto:[email protected]]=20
Sent: Wednesday, November 05, 2008 12:24 PM
To: ruby-talk ML
Subject: replace values in hash
=20
how would I iterate over a hash, such as
=20
x =3D { 'a' =3D> "hi", 'b' =3D> nil, 'c' =3D> "do"}


h.keys.each {|d| h[d] =3D "foo" if h[d] =3D=3D nil}
 
T

Trans

Thank you!

However, I am getting undefined method 'mash' even though I do require
'facets/enumerable/mash'

am I missing something?

Don't think so. It's working fine for me.

What version of Ruby and Facets and what platform are you running?

T.
 
B

Brian Adkins

Jason Lillywhite said:
how would I iterate over a hash, such as

x = { 'a' => "hi", 'b' => nil, 'c' => "do"}

and replace nil values with 'foo' then return the hash again?

~/temp$ cat -b temp.rb
1 require 'pp'

2 class Hash
3 def replace_value old, new
4 self.inject({}) do |result,pair|
5 k, v = pair[0], pair[1]
6 result[k] = (v == old) ? new : v
7 result
8 end
9 end
10 end

11 x = { 'a' => "hi", 'b' => nil, 'c' => "do", :d => nil }
12 pp x
13 y = x.replace_value(nil, 'foo')
14 pp y
~/temp$ ruby temp.rb
{"a"=>"hi", "b"=>nil, :d=>nil, "c"=>"do"}
{"a"=>"hi", "b"=>"foo", "c"=>"do", :d=>"foo"}
 
T

Trans

Don't think so. It's working fine for me.

What version of Ruby and Facets and what platform are you running?

For anyone who is interested, here's the definition (and some side
notes about how it evolved).

def mash(&yld)
if yld
inject({}) do |h, *kv| # Used to be inject({}) do |h,kv|
r =3D *yld[*kv] # The *-op works different from to_a on
single element hash!!!
nk, nv =3D *r # Used to be nk, nv =3D
*yld[*kv].to_a.flatten
h[nk] =3D nv
h
end
else
Enumerator.new(self,:mash) # Used to be Hash[*self.to_a]
end
end

T.
 
J

James Herdman

[Note: parts of this message were removed to make it a legal post.]

Not bad. Let's tighten it up a little:

class Hash
def replace_value(old, new)
self.inject({}) do |result, (key, existing_value)|
result[key] = (value == old) ? new : existing_value
result
end
end
end

This isn't bad, but you wouldn't want to do this for large Hashes since you
end up copying the original.

James

Jason Lillywhite said:
how would I iterate over a hash, such as

x = { 'a' => "hi", 'b' => nil, 'c' => "do"}

and replace nil values with 'foo' then return the hash again?

~/temp$ cat -b temp.rb
1 require 'pp'

2 class Hash
3 def replace_value old, new
4 self.inject({}) do |result,pair|
5 k, v = pair[0], pair[1]
6 result[k] = (v == old) ? new : v
7 result
8 end
9 end
10 end

11 x = { 'a' => "hi", 'b' => nil, 'c' => "do", :d => nil }
12 pp x
13 y = x.replace_value(nil, 'foo')
14 pp y
~/temp$ ruby temp.rb
{"a"=>"hi", "b"=>nil, :d=>nil, "c"=>"do"}
{"a"=>"hi", "b"=>"foo", "c"=>"do", :d=>"foo"}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top