使用循环时将哈希合并到数组中

时间:2015-10-12 05:52:22

标签: ruby-on-rails arrays ruby

目前我通过这样做得到一系列哈希:

f = File.open("public/odds/test.xml")
xml = Nokogiri::XML(f)
path = "//demo/test1/test"
xml.xpath(path).map do |x|
{'country' => x.parent}
end

我的结果样本:

[{"country"=>"france"}, {"country"=>"singapore"}, {"country"=>"thailand"}]

现在我有不同的xml文件,我正在循环遍历所有文件:

@files = ['a', 'b', 'c']
@files.each do |file|
f = File.open("public/odds/#{file}.xml)
xml = Nokogiri::XML(f)
path = "//demo/test1/test"
xml.xpath(path).map do |x|
{'country' => x.parent}
end

当循环遍历每个文件时,我希望得到3个不同的结果,例如[{"country"=>"france"}, {"country"=>"singapore"}, {"country"=>"thailand"}]。如何将它们合并在一起以便它们位于1个数组中?

2 个答案:

答案 0 :(得分:1)

我想你这样试试。只需声明新数组,在该数组arr << {'country' => x.parent}内推送所有哈希值,并将map替换为each循环

 arr=[]
    @files = ['a', 'b', 'c']
    @files.each do |file|
    f = File.open("public/odds/#{file}.xml)
    xml = Nokogiri::XML(f)
    path = "//demo/test1/test"
    xml.xpath(path).each do |x|
       arr << {'country' => x.parent}
    end
end

    return arr

答案 1 :(得分:1)

你想注射结果吗? Array#inject来救援:

path = "//demo/test1/test"
#      ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓
result = @files.inject([]) do |memo, file|
  File.open("public/odds/#{file}.xml") do |f|
    xml = Nokogiri::XML(f)
#   ⇓⇓⇓⇓⇓⇓⇓
    memo << xml.xpath(path).map do |x|
              {'country' => x.parent}
            end
  end
end.flatten
puts result
#⇒ [ {"country"=>"france"}, {"country"=>"singapore"}, {"country"=>"thailand"},
#     ...
#     ... ]

另外,考虑使用带有块的File#open。在您的代码中,打开的文件保持未闭合状态,而块将在返回时自动关闭它们。是否仍然想要使用File#new(≡File#open没有阻止),只要不再需要该文件,就应该明确地调用f.close