【问题标题】:how to convert a hash into an array with particular order? (ruby)如何将哈希转换为具有特定顺序的数组? (红宝石)
【发布时间】:2010-01-23 20:25:43
【问题描述】:

我有一个哈希值 (@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

【问题讨论】:

    标签: arrays ruby hash


    【解决方案1】:

    这一行:

    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 返回一个新数组,其中包含每次调用块的结果。

    【讨论】:

    • @Theo:谢谢你的解决方案。我不明白为什么 csv &lt;&lt; (@post_csv_order.each {|element| element}) 标题工作
    • 它之所以有效,是因为它所做的只是csv &lt;&lt; @post_csv_order,而@post_csv_order 包含标题。 .each { |element| element } (除了本身是无操作之外)没有任何效果。 each 返回数组本身,即消息的接收者。 each 只是一个循环结构,只有在循环有副作用时才有用,而你的循环没有。您正在使用 each,就好像它是 map
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2014-03-05
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多