如何将哈希转换为具有特定顺序的数组? (红宝石)

时间:2010-01-23 20:25:43

标签: arrays ruby hash

我有哈希哈希(@post),我想把它保存到csv中。对我来说很奇怪的是我的方法适用于标题但不适用于行。如果我使用

显示行

csv << (@post_csv_order.each {|element| puts single_post[element]})

我可以在屏幕上看到正确的字符串,但csv文件包含散列键的值而不是散列值的值。基本上我在csv中有5行标题而不是正确的值。

我想我需要将@post [key]哈希转换为一个基于@post_csv_order的命令的数组(包含@ post [key]哈希的键)有一个哈希方法to_a但它会不要给我我需要的订单。

我猜你可能会提出不同的方法而不是使用散列哈希,但我也想知道如何将哈希转换为具有某种预定义顺序的数组

另一方面,如果有任何简单的方法如何将散列哈希保存到csv / table ,我很乐意重写我的代码。

  require 'rubygems'
  require 'faster_csv'
  require 'pp'

  @post = {123 => {"ForumID" => "123", "Post author" => "Thom" }, 
           222 => {"ForumID" => "222", "Post author" => "Mark"},
           345 => {"ForumID" => "345", "Post author" => "Eddy"},
           444 => {"ForumID" => "444", "Post author" => "Eli"}}
  @post_csv_order = [
                      "ForumID" ,
                      "Post author"  
                     ]

  FasterCSV.open("test.csv", "w", { :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true, :return_headers => false, :force_quotes => true}) do |csv|
    csv << (@post_csv_order.each {|element| element})
       @post.each_value do |single_post|
        csv << (@post_csv_order.each {|element| single_post[element]})  
     #csv << (@post_csv_order.each {|element| puts single_post[element]})
      end 
  end

1 个答案:

答案 0 :(得分:3)

这一行:

csv << @post_csv_order.each {|element| single_post[element]}

遍历@post_csv_order数组并返回数组本身,这不是你想要的。在这种情况下,each和块实际上没有做任何事情。如果您将each更改为map,它会执行您想要的操作:

csv << @post_csv_order.map {|element| single_post[element]}

map返回一个新数组,其中包含每次调用块的结果。