У меня есть хеш (@post) хешей, где я хочу сохранить порядок ключей хеша в массиве (@post_csv_order) и также хотеть сохранить ключ отношений => значение в массиве.
Я не знаю заключительное количество и хешей @post и ключа => элементы значения в массиве.
Я не знаю, как присвоить хеш в цикле для всех элементов в массиве. Один за другим @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
желаемое присвоение хеша должно быть похожим на это
{123=>{"Post title"=>"Test post", "ForumID"=>123}}
Я не уверен, что я полностью понимаю ваш вопрос, но я думаю, вы хотите преобразовать 2D массив в хэш.
Так что предположим, что у вас есть такой массив, как:
array = [[:foo,1],[:bar,2],[:baz,3]]
, вы можете построить хеш с:
hash = array.inject({}) {|h,e| h[e[0]] = e[1]; h}
# => {:foo=>1, :bar=>2, :baz=>3}
, и вы можете получить ключи в правильном порядке с:
keys = array.inject([]) {|a,e| a << e[0] }
=> [:foo, :bar, :baz]
Это то, что вы искали?
Лучше всего использовать -_h
:
[ [:foo,1],[:bar,2],[:baz,3] ].to_h #=> {:foo => 1, :bar => 2, :baz => 3}
Примечание: Это было введено в Ruby 2.1.0. Для более старых версий Ruby, вы можете использовать мои бэкпорты
и требуют 'backports/2.1.0/array/to_h'
, или использовать Hash[]
:
array = [[:foo,1],[:bar,2],[:baz,3]]
# then
Hash[ array ] #= > {:foo => 1, :bar => 2, :baz => 3}
Это доступно в версии Ruby 1.8.7 и более поздних версий. Если вы все еще используете Ruby 1.8.6, вы можете потребовать "backports/1.8.7/hash/constructor"
, но вы также можете использовать to_h
backport.