哈希赋值何时(key => value)存储在数组中?(红宝石)

Rad*_*dek 6 ruby arrays hash

我有哈希哈希(@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}}

Mar*_*une 5

最好的方法是使用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.


par*_*tic 1

我不确定我完全理解你的问题,但我想你想将二维数组转换为哈希值。

因此,假设您有一个数组,例如:

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)

这是您要找的吗?

  • 从键值对数组构建哈希的另一种方法是: Hash[*array.flatten] (2认同)