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

时间:2013-02-06 14:16:52

标签: ruby algorithm data-structures collections

我有一个这样的数组:

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中必须有更好的方法。

3 个答案:

答案 0 :(得分:6)

试试:

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

答案 1 :(得分:3)

一个简单的#map后跟uniq(àla joscas)是一个很好的解决方案,但只是为了好玩,这将使用最少的内存......

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

答案 2 :(得分:0)

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

require 'set'

myset = Set.new
myset.reject(&:nil?)

myset.add('sess2')
myset.add('sess1')
myset.add('sess1')

添加已存在的项目对集合没有明显影响。上一段代码将生成一个仅由'sess1''sess2'组成的集合:<Set: {'sess1', 'sess2'}>

此外,如果您不需要包含丢失的nil密钥,@nicooga pointed out可以拒绝'sess'