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(àlajoscas )が 続くのは良い解決策ですが、楽しみのために、これは最小限のメモリを使用します...

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

要素の一意のオカレンスを格納するデータ構造は、と呼ばれ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'ます。

于 2013-02-06T14:21:56.377 に答える