Ruby Method of the Day - Array.delete_if

Posted by Kelly McCauley on Nov 14, 2007

Signature

array.delete_if {|element| block}   #=> array

array.delete_if {|element| block} iterates over all elements of array and deletes an element from array if block returns true for that element.

Examples

1
2
3
a = [1,2,3,4,5,6,7,8,9,10]    #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.delete_if {|n| n % 2 == 0}  #=> [1, 3, 5, 7, 9]
a                             #=> [1, 3, 5, 7, 9]

The following is another usage example.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env ruby
#
# A contrived example of using Array.delete_if
#

$VERBOSE = true

require 'pp'

# Member of an organization.
class Member
  attr_accessor :name
  attr_accessor :current
  def current?
    @current
  end
end


# Raw member data
members_data = [
  ['Bob', true],
  ['Fred', false],
  ['Bill', false],
  ['Alice', true]
]

# Create the members based on the raw member data
members = members_data.map do |entry|
  member = Member.new
  member.name = entry[0]
  member.current = entry[1]
  member
end

puts 'Before purging of non-current members...'
pp members
puts "\n"

# Purge non-current members.
members.delete_if {|member| !member.current?}

puts 'After purging of non-current members...'
pp members


Produces…

Before purging of non-current members...
[#<Member:0x87780 @current=true, @name="Bob">,
 #<Member:0x877a8 @current=false, @name="Fred">,
 #<Member:0x87794 @current=false, @name="Bill">,
 #<Member:0x8776c @current=true, @name="Alice">]

After purging of non-current members...
[#<Member:0x87780 @current=true, @name="Bob">,
 #<Member:0x8776c @current=true, @name="Alice">]

Documentation Reference

Ruby version 1.8.6

www.ruby-doc.org : Array.delete_if

Trackbacks

Use the following link to trackback from your own site:
http://drotner.org/articles/trackback/70