Adding keys to a hash in a loop

J

Jack Bauer

Hi all,

I'm trying to essentially accomplish this behavior:

output.each do |item|
output_hash << {item.name => []}
end

So that I can end up with:

{"first_set" => [], "second_set" => [], "third_set" => [], ... }

I know the first block of code won't work, but it's just to illustrate
what it is I wish to accomplish. Can anyone help me out? Thanks.
 
R

Robert Klemme

I'm trying to essentially accomplish this behavior:

output.each do |item|
output_hash<< {item.name => []}
end

So that I can end up with:

{"first_set" => [], "second_set" => [], "third_set" => [], ... }

I know the first block of code won't work, but it's just to illustrate
what it is I wish to accomplish. Can anyone help me out? Thanks.

Erm, how would you put a key value pair into a Hash without a loop?

http://www.ruby-doc.org/core/classes/Hash.html

Kind regards

robert
 
J

Jack Bauer

Robert said:
Erm, how would you put a key value pair into a Hash without a loop?

This is the loop...

output.each do |item|
output_hash << {item.name => []}
end

Iterate through items in the "output" array and create a key for the
"output_hash" hash using the value of "item.name" as the key, and an
empty array as the value for that key.

I know the output_hash << won't work, that's why I'm asking how I can go
about it. I was just using that as a sort of pseudo-code to get my point
across.
 
M

Marnen Laibow-Koser

Jack said:
Robert said:
Erm, how would you put a key value pair into a Hash without a loop?

This is the loop...

output.each do |item|
output_hash << {item.name => []}
end

Iterate through items in the "output" array and create a key for the
"output_hash" hash using the value of "item.name" as the key, and an
empty array as the value for that key.

I know the output_hash << won't work, that's why I'm asking how I can go
about it. I was just using that as a sort of pseudo-code to get my point
across.

The same way you assign to a hash element outside a loop:
output_hash[item.name] = value . << is only useful with arrays, not
hashes.

Best,
 
J

Jack Bauer

Marnen said:
The same way you assign to a hash element outside a loop:
output_hash[item.name] = value . << is only useful with arrays, not
hashes.


Thanks, I know << is only for arrays. Using = will only end up with one
key and not all 10 that I'm trying to get.
 
M

Marnen Laibow-Koser

Jack said:
Marnen said:
The same way you assign to a hash element outside a loop:
output_hash[item.name] = value . << is only useful with arrays, not
hashes.


Thanks, I know << is only for arrays. Using = will only end up with one
key and not all 10 that I'm trying to get.

Wrong. Do it inside the loop, for each key in turn. Try it!

Best,
 
M

Matthew Pounsett

Marnen said:
The same way you assign to a hash element outside a loop:
output_hash[item.name] = value . << is only useful with arrays, not
hashes.


Thanks, I know << is only for arrays. Using = will only end up with one
key and not all 10 that I'm trying to get.

Hi Jack.

The suggestion is not to just replace << with = like this:

output.each do |item|
output_hash = {item.name => []}
end

The suggestion is to use = in a normal hash assignment:

output.each do |item|
output_hash[item.name] = []
end

HTH,
Matt
 
B

Brian Candler

Jack said:
Hi all,

I'm trying to essentially accomplish this behavior:

output.each do |item|
output_hash << {item.name => []}
end

Apart from the other suggestions, you can do:

output.each do |item|
output_hash.merge!(item.name => [])
end
 
M

Marnen Laibow-Koser

Brian said:
Jack said:
Hi all,

I'm trying to essentially accomplish this behavior:

output.each do |item|
output_hash << {item.name => []}
end

Apart from the other suggestions, you can do:

output.each do |item|
output_hash.merge!(item.name => [])
end

Yes. Although merging a single-key hash seems silly, and creates extra
objects...

Best,
-- 
Marnen Laibow-Koser
http://www.marnen.org
(e-mail address removed)
 
Y

yermej

Hi all,

I'm trying to essentially accomplish this behavior:

output.each do |item|
  output_hash << {item.name => []}
end

Depending on how you'll be using output_hash, you might use a default
value instead of individually initializing the values. Based on your
sample, you can likely use:

output_hash = Hash.new {|hash, key| hash[key] = Array.new}

I'm guessing this is what Robert was hinting at.
 
R

Robert Klemme

2010/2/2 yermej said:
Hi all,

I'm trying to essentially accomplish this behavior:

output.each do |item|
=A0 output_hash << {item.name =3D> []}
end

Depending on how you'll be using output_hash, you might use a default
value instead of individually initializing the values. Based on your
sample, you can likely use:

output_hash =3D Hash.new {|hash, key| hash[key] =3D Array.new}

I'm guessing this is what Robert was hinting at.

Actually, no. :) But you are right, this is certainly an option in
many cases. It all depends on the situation and we do know nothing
about the "surrounding" code.

I rather tried to help Jack solve this for himself since it's not too
tricky. Providing the full solution is not always the best choice
IMHO.

Kind regards

robert

--=20
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
 

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,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top