2017-02-24 20 views
0

有沒有一種方法,我可以選擇在arrayhash一個value,並重新格式化它是唯一的哈希?紅寶石拿起值數組的哈希重新格式化成散列

我可以用它做什麼方法?

[ 
    { 
    "qset_id" => 1, 
    "name" => "New1" 
    }, 
    { 
    "qset_id" => 2, 
    "name" => "New2" 
    } 
] 

結果

{ 
    1 => { 
     "name" => "New1" 
    }, 
    2 => { 
     "name" => "New2" 
    } 
} 
+0

當你舉一個例子(一般是好事)是有幫助的分配給每個輸入對象的變量(例如,'ARR = [...] ')。這樣,讀者可以在回答和評論中引用這些變量,而不必定義它們。而且,所有讀者都會參考相同的變量,這也是有幫助的。 –

回答

0

你可以遍歷第一哈希值,並將其映射到第二散列:

h1.map{|h| {h['qset_id'] => {'name' => h['name']}} } 
# => [{1=>{"name"=>"New1"}}, {2=>{"name"=>"New2"}}] 

...但是這將返回數組。你可以拉元素融入第二散列這樣的:

h2 = {} 
h1.each do |h| 
    h2[h['qset_id']] = {'name' => h['name']} 
end 
>> h2 
=> {1=>{"name"=>"New1"}, 2=>{"name"=>"New2"}} 
+0

謝謝,它工作正常。 –

1

基本上可以做到使用上的數組或哈希reduce功能arbitary操作,例如這將讓你的結果

array.reduce({}) do |result, item| 
    result[item["qset_id"]] = { "name" => item["name"] } 
    result 
end 

你可以做同樣的事情each.with_object做:

array.each.with_object({}) do |item, result| 
    result[item["qset_id"]] = { "name" => item["name"] } 
    end 

它基本上是相同的事情,但你不必讓每個迭代返回的結果(稱爲「備忘錄對象」)。

+0

對我來說這個輸出不符合要求:'[nil,{「name」=>「New1」},{「name」=>「New2」}]' – mysmallidea

+0

@mysmallidea我的壞,更新回答 –

+0

我喜歡'with_object'比我的更好。 – mysmallidea