2

我有一个这样的数组:

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

4

3 回答 3

6

试试看:

array.map{|n| n["sess"]}.uniq
于 2013-02-06T14:18:11.287 回答
3

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

array.inject({}) { |m, e| m[e['sess']] = :_; m }.keys
于 2013-02-06T15:01:57.340 回答
0

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

require 'set'

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

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

添加一个已经存在的项目在集合中不会有明显的效果。前面的代码片段将产生一个由'sess1'和组成的集合'sess2'<Set: {'sess1', 'sess2'}>

此外,正如@nicooga 指出nil的那样,如果您不需要包含丢失的'sess'密钥,则可以拒绝a 。

于 2013-02-06T14:21:56.377 回答