哈希数组推入另一个数组

sak*_*vel 2 ruby arrays loops ruby-on-rails

我有一个数组包含哈希,我想从哈希过滤几个参数并将过滤后的数据插入另一个数组但下面不成功的是我用过的样本数据

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
Run Code Online (Sandbox Code Playgroud)

我得到了这个结果:

[
  {:name=>"name2", :age=>"26"},
  {:name=>"name2", :age=>"26"}
]
Run Code Online (Sandbox Code Playgroud)

但我期待这样:

[
  {:name=>"hello", :age=>"12"},
  {:name=>"name2", :age=>"26"}
]
Run Code Online (Sandbox Code Playgroud)

有人请帮忙解决这个问题,提前谢谢

Dee*_*ale 5

您可以结合使用map和获得预期结果slice

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

a.map{ |e| e.slice("name", "age") }
#=> [{"name"=>"hello", "age"=>"12"}, {"name"=>"name2", "age"=>"26"}]
Run Code Online (Sandbox Code Playgroud)
  • map:返回Array包含块返回的值
  • slice:返回Hash仅包括指定的键


Ste*_*fan 5

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

line_items = []
a.each do |datas|
  hash_data = {}
  hash_data[:name] = datas["name"]
  hash_data[:age] = datas["age"]
  line_items << hash_data
end
Run Code Online (Sandbox Code Playgroud)

代码看起来有点不合时宜.让我们重构一下吧.

我们可以在哈希文字中设置密钥:

line_items = []
a.each do |datas|
  hash_data = { name: datas["name"], age: datas["age"] }
  line_items << hash_data
end
Run Code Online (Sandbox Code Playgroud)

我们可以摆脱hash_data变量:

line_items = []
a.each do |datas|
  line_items << { name: datas["name"], age: datas["age"] }
end
Run Code Online (Sandbox Code Playgroud)

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

line_items = a.map { |h| { name: h["name"], age: h["age"] } }
#=> [{:name=>"hello", :age=>"12"}, {:name=>"name2", :age=>"26"}]
Run Code Online (Sandbox Code Playgroud)