首页 > 解决方案 > 哈希数组推入另一个数组

问题描述

我有一个包含哈希的数组,我想从哈希中过滤几个参数并将过滤后的数据插入另一个数组,但下面是我使用的示例数据

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

我得到这个结果:

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

但我期待这个:

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

有人请帮助解决这个问题,在此先感谢

标签: ruby-on-railsarraysrubyloops

解决方案


在循环外定义散列意味着您不断添加相同的散列对象(同时覆盖其先前的值)。相反,在循环中创建一个新的哈希:

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

代码看起来有点单调。让我们重构它。

我们可以在散列文字中设置键:

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

我们可以去掉这个hash_data变量:

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

我们可以使用map直接转换数组:

line_items = a.map { |h| { name: h["name"], age: h["age"] } }
#=> [{:name=>"hello", :age=>"12"}, {:name=>"name2", :age=>"26"}]

推荐阅读