散列数组中特定键的不同出现次数

我有一个这样的数组:

array = [{"id"=>"id1", "email"=>"name@organization.com", "sess"=>"sess1"}, {"id"=>"id2", "email"=>"name@organization.com", "sess"=>"sess2"}, {"id"=>"id3", "email"=>"name@organization.com", "sess"=>"sess2"}, {"id"=>"id4", "email"=>"name@organization.com", "sess"=>"sess3"}, {"id"=>"id5", "email"=>"name@organization.com", "sess"=>"sess2"}, {"id"=>"id6", "email"=>"name@organization.com", "sess"=>"sess3"}, {"id"=>"id7", "email"=>"name@organization.com", "sess"=>"sess2"}, {"id"=>"id8", "email"=>"name@organization.com", "sess"=>"sess5"}, {"id"=>"id9", "email"=>"name@organization.com", "sess"=>"sess2"}, {"id"=>"id10", "email"=>"name@organization.com", "sess"=>"sess2"},] 

我怎么能以简洁的方式做一些能够不经重复地返回所有不同出现的“sess”的东西?:

 ["sess1", "sess2", "sess3", "sess5"] 

我已经开始编写一个循环来迭代所有元素,并在每次“sess”值已经存在的情况下构建一个新的哈希检查,但我确信在Ruby中必须有更好的方法。

试试看:

 array.map{|n| n["sess"]}.uniq 

一个简单的#map跟随uniq( àlajoscas )是一个很好的解决方案,但只是为了好玩,这将使用最小的内存……

 array.inject({}) { |m, e| m[e['sess']] = :_; m }.keys 

存储唯一出现的元素的数据结构称为Set 。 Ruby在它的“标准库”中有一个Set类,您可以使用它,如下面的代码段所示(然后您可以适应您的代码):

 require 'set' myset = Set.new myset.reject(&:nil?) myset.add('sess2') myset.add('sess1') myset.add('sess1') 

添加已存在的项目对集合没有明显影响。 前面的代码片段将生成一个仅由'sess1''sess2'组成的集合:

此外,正如@nicooga所指出的,如果您不需要包含缺少的'sess'键,则可以拒绝nil