2016-10-27 3 views
-1

В Ruby у меня есть список объектов, называемых Things, с собственностью Id и value.Конвертировать список объектов в хэш

Я хочу сделать хеш, который содержит Id в качестве ключа и Value как значение для координирующего ключа.

Я пробовал:

result = Hash[things.map { |t| t.id, t.value }] 

где things список Thing

Но это не сработало.

+0

@potashin, я считаю, «список» означает массив. –

+0

Что значит «не работает»? Не вернул ли он неправильный результат? Это вызвало исключение? Если последнее, что было исключением? Я не вижу ничего плохого в вашем коде. –

ответ

0
result = things.map{|t| {t.id => t.value } } 

Содержание внешней пары фигурных скобок представляет собой блок, внутренняя пара образует хэш. Однако, если один хэш желаемый результат (как это было предложено Cary Swoveland) это может работать:

result = things.each_with_object({}){| t, h | h[t.id] = t.value} 
1
class Thing 
    attr_reader :id, :value 
    def initialize(id, value) 
    @id = id 
    @value = value 
    end 
end 

cat = Thing.new("cat", 9) 
    #=> #<Thing:0x007fb86411ad90 @id="cat", @value=9> 
dog = Thing.new("dog",1) 
    #=> #<Thing:0x007fb8650e49b0 @id="dog", @value=1> 

instances =[cat, dog] 
    #=> [#<Thing:0x007fb86411ad90 @id="cat", @value=9>, 
    # #<Thing:0x007fb8650e49b0 @id="dog", @value=1>] 

instances.map { |i| [i.id, i.value] }.to_h 
    #=> {"cat"=>9, "dog"=>1} 

или, для версий Ruby, до 2,0:

Hash[instances.map { |i| [i.id, i.value] }] 
    #=> {"cat"=>9, "dog"=>1} 
Смежные вопросы