хэш присваивания, когда (ключ => значение) хранятся в массиве? (Рубин) - PullRequest
6 голосов
/ 24 января 2010

У меня есть хэш (@post) хешей , где я хочу сохранить порядок ключей хеша в массиве (@post_csv_order), а также хочу сохранить значение ключ отношения => в массиве .

Я не знаю окончательного количества элементов @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

желаемое присвоение хеша должно быть таким

{123=>{"Post title"=>"Test post", "ForumID"=>123}}

Ответы [ 3 ]

5 голосов
/ 24 января 2010

Лучше всего использовать to_h:

[ [:foo,1],[:bar,2],[:baz,3] ].to_h  #=> {:foo => 1, :bar => 2, :baz => 3}

Примечание : это было введено в Ruby 2.1.0. Для более старых Ruby вы можете использовать мой backports самоцвет и 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}

Это доступно в Ruby 1.8.7 и более поздних версиях. Если вы все еще используете Ruby 1.8.6, вы можете require "backports/1.8.7/hash/constructor", но вы также можете использовать to_h backport.

1 голос
/ 24 января 2010

Я не уверен, что полностью понимаю ваш вопрос, но, думаю, вы хотите преобразовать 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]

Это то, что вы искали?

0 голосов
/ 17 января 2017

Сводка ответов

рабочий код # 1

@post[forum_id] = @post_csv_order.inject({}) {|h,e| h[e[0]] = e[1]; h}

рабочий код # 2

@post[forum_id] = Hash[*@post_csv_order.flatten]

рабочий код # 3

@post[forum_id] ||= Hash[ @post_csv_order ] #requires 'require "backports"'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...