我有哈希哈希(@post),我希望在数组中保持哈希键的顺序(@post_csv_order),并且还希望在数组中保持关系key => value.
我不知道数组中@post哈希和key => value元素的最终数量.
我不知道如何在循环中为数组中的所有元素分配哈希.一个接一个地@post_csv_order[0][0] => @post_csv_order[0][1]工作得很好.
# require 'rubygems'
require 'pp'
@post = {}
forum_id = 123 #only sample values.... to make this sample script work
post_title = "Test post"
@post_csv_order = [
["ForumID" , forum_id],
["Post title", post_title]
]
if @post[forum_id] == nil
@post[forum_id] = {
@post_csv_order[0][0] => @post_csv_order[0][1],
@post_csv_order[1][0] => @post_csv_order[1][1]
#@post_csv_order.map {|element| element[0] => element[1]}
#@post_csv_order.each_index {|index| @post_csv_order[index][0] => @post_csv_order[index][1] }
}
end
pp @post
Run Code Online (Sandbox Code Playgroud)
所需的哈希分配应该是这样的
{123=>{"Post title"=>"Test post", "ForumID"=>123}}
最好的方法是使用to_h:
[ [:foo,1],[:bar,2],[:baz,3] ].to_h #=> {:foo => 1, :bar => 2, :baz => 3}
Run Code Online (Sandbox Code Playgroud)
注意:这是在Ruby 2.1.0中引入的.对于较旧的Ruby,您可以使用我的backportsgem require 'backports/2.1.0/array/to_h',或者使用Hash[]:
array = [[:foo,1],[:bar,2],[:baz,3]]
# then
Hash[ array ] #= > {:foo => 1, :bar => 2, :baz => 3}
Run Code Online (Sandbox Code Playgroud)
这在Ruby 1.8.7及更高版本中可用.如果您仍在使用Ruby 1.8.6,那么您也可以require "backports/1.8.7/hash/constructor"使用to_hbackport.
我不确定我完全理解你的问题,但我想你想将二维数组转换为哈希值。
因此,假设您有一个数组,例如:
array = [[:foo,1],[:bar,2],[:baz,3]]
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令构建哈希:
hash = array.inject({}) {|h,e| h[e[0]] = e[1]; h}
# => {:foo=>1, :bar=>2, :baz=>3}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令按正确的顺序检索密钥:
keys = array.inject([]) {|a,e| a << e[0] }
=> [:foo, :bar, :baz]
Run Code Online (Sandbox Code Playgroud)
这是您要找的吗?