散列数组中特定键的不同出现次数
我有一个这样的数组:
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
。