Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Array of Hashes push into another Array

I've an array contains hashes, I want to filter few parameters from the hash and insert the filtered data in another array but am not succeed below is the sample data I've used

a = Array.new
a = [
  {"name"=>"hello", "age"=>"12", "sex"=> "M", "city"=>"Chennai"},
  {"name"=>"name2", "age"=>"26", "sex"=> "M", "city"=>"Banglore"}
]
line_item = Array.new
hash_data = {}

a.each do |datas|
  hash_data[:name] = datas["name"]
  hash_data[:age] = datas["age"]
  line_item << hash_data
end

I am getting this result:

[
  {:name=>"name2", :age=>"26"},
  {:name=>"name2", :age=>"26"}
]

But am expecting this:

[
  {:name=>"hello", :age=>"12"},
  {:name=>"name2", :age=>"26"}
]

Somebody please help to sort out this, Thanks in advance

like image 697
sakthivel Avatar asked Jun 02 '26 22:06

sakthivel


1 Answers

Defining the hash outside the loop means that you keep adding the same hash object again (while overwriting its previous values). Instead, create a fresh hash within the loop:

line_items = []
a.each do |datas|
  hash_data = {}
  hash_data[:name] = datas["name"]
  hash_data[:age] = datas["age"]
  line_items << hash_data
end

The code looks a bit unidiomatic. Let's refactor it.

We can set the keys right within the hash literal:

line_items = []
a.each do |datas|
  hash_data = { name: datas["name"], age: datas["age"] }
  line_items << hash_data
end

We can get rid of the hash_data variable:

line_items = []
a.each do |datas|
  line_items << { name: datas["name"], age: datas["age"] }
end

And we can use map to directly transform the array:

line_items = a.map { |h| { name: h["name"], age: h["age"] } }
#=> [{:name=>"hello", :age=>"12"}, {:name=>"name2", :age=>"26"}]
like image 56
Stefan Avatar answered Jun 05 '26 12:06

Stefan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!