items = [
{name: 'john', attr: 'foo'},
{name: 'john', attr: 'bar'},
{name: 'john', attr: 'baz'},
{name: 'paul', attr: 'foo'},
].uniq { |item| item[:name] }
puts items.first[:attr] #=> ??
Array#uniq
した時に残されるアイテムが保証されてるのか気になったので調べた
公式ドキュメントより
uniq は配列から重複した要素を取り除いた新しい配列を返します。 uniq! は削除を破壊的に行い、削除が行われた場合は self を、 そうでなければnil を返します。
取り除かれた要素の部分は前に詰められます。 要素の重複判定は、Object#eql? により行われます。
instance method Array#uniq - Ruby 2.5.0 リファレンスマニュアル
日本語版だとどっちが残されるのか曖昧
self is traversed in order, and the first occurrence is kept.
英語ドキュメントにはちゃんと書いてあった。最初に見つけたのを保持する。