diff options
author | José Valim and Mikel Lindsaar <pair@programming.com> | 2010-01-24 23:28:52 +0100 |
---|---|---|
committer | José Valim and Mikel Lindsaar <pair@programming.com> | 2010-01-24 23:28:52 +0100 |
commit | 0361414ae328c10de8ed778e826d8244ba0aa63a (patch) | |
tree | 69dcc4b2c63c8e86d24e9ce84c14254e7c90e3ba /activesupport/lib | |
parent | a74a655648618a6ed568b9b4ef3a17a8970e7774 (diff) | |
download | rails-0361414ae328c10de8ed778e826d8244ba0aa63a.tar.gz rails-0361414ae328c10de8ed778e826d8244ba0aa63a.tar.bz2 rails-0361414ae328c10de8ed778e826d8244ba0aa63a.zip |
Add uniq_by and uniq_by! to Array.
Diffstat (limited to 'activesupport/lib')
-rw-r--r-- | activesupport/lib/active_support/core_ext/array.rb | 1 | ||||
-rw-r--r-- | activesupport/lib/active_support/core_ext/array/uniq_by.rb | 17 |
2 files changed, 18 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/core_ext/array.rb b/activesupport/lib/active_support/core_ext/array.rb index b583c7533e..4688468a8f 100644 --- a/activesupport/lib/active_support/core_ext/array.rb +++ b/activesupport/lib/active_support/core_ext/array.rb @@ -1,5 +1,6 @@ require 'active_support/core_ext/array/wrap' require 'active_support/core_ext/array/access' +require 'active_support/core_ext/array/uniq_by' require 'active_support/core_ext/array/conversions' require 'active_support/core_ext/array/extract_options' require 'active_support/core_ext/array/grouping' diff --git a/activesupport/lib/active_support/core_ext/array/uniq_by.rb b/activesupport/lib/active_support/core_ext/array/uniq_by.rb new file mode 100644 index 0000000000..a09b2302fd --- /dev/null +++ b/activesupport/lib/active_support/core_ext/array/uniq_by.rb @@ -0,0 +1,17 @@ +class Array + # Return an unique array based on the criteria given as a proc. + # + # [1, 2, 3, 4].uniq_by { |i| i.odd? } + # #=> [1, 2] + # + def uniq_by + hash, array = {}, [] + each { |i| hash[yield(i)] ||= (array << i) } + array + end + + # Same as uniq_by, but modifies self. + def uniq_by! + replace(uniq_by{ |i| yield(i) }) + end +end |