Ruby哈希,密钥为哈希,值为数组

时间:2015-06-16 04:08:15

标签: ruby hash

我正在创建一个哈希,其键是一个哈希,值是一个数组。如,

shop = Hash.new
items.each do |item|
  grouping_key = {
    'name'=> item['name'],
    'value'=> item['value']
  }
  shop [grouping_key] ||= Array.new
  shop [grouping_key] << item
end

在这里,我根据分组键对每个项目进行分组。对于以下项目:

Item1 = {'name'=>'test', 'value'=>10, 'color'=>'black', 'description'=>'item1'}
Item2 = {'name'=>'test2', 'value'=>10, 'color'=>'blue', 'description'=>'item2'}
Item3 = {'name'=>'test', 'value'=>10, 'color'=>'black', 'description'=>'item3'}
Item4 = {'name'=>'test2', 'value'=>10, 'color'=>'blue', 'description'=>'item4'}

我的店铺哈希将是:

shop = {{'name'=>'test', 'value'=>10}=>[Item1, Item3], {name=>test2, value=>10}=>[Item2, Item4]}

我想为散列键添加颜色,但不是分组键的一部分。是否可以这样做而不重复哈希并修改它? e.g。

shop = {{'name'=>'test', 'value'=>10, 'color'=>'black'}=>[Item1, Item3], {'name'=>'test2', 'value'=>10, 'color'=>'blue'}=>[Item2, Item4]}

任何其他方法也会有所帮助。

1 个答案:

答案 0 :(得分:1)

您的初始代码相当于

shop = items.group_by do | i | 
  {'name' => i['name'], 'value' => i['value'] }
end

要将颜色添加到键哈希,只需执行

shop = items.group_by do | i | 
  {'name' => i['name'], 'value' => i['value'], 'color' => i['color'] }
end

现在,您也按颜色进行分组。

如果这不是您的意图(“但不作为分组键的一部分”),即如果可能存在具有相同名称和值但颜色不同的项目,并且这些项目将进入同一组,那么您首先必须决定组中哈希的颜色。

在这种情况下,对哈希进行后处理将是最简单的:

shop = items.group_by do | i | 
  {'name' => i['name'], 'value' => i['value'] }
end
shop.keys.each { | h | h['color'] = shop[h].sample['color'] }