2017-02-24 21 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