user3385895
user3385895

Reputation: 15

Remove element from array by type

I have the following array:

["--",1,2,3,4]

How can I remove elements from the array by element type, ie. remove all non-integer values from the array?

Upvotes: 1

Views: 254

Answers (4)

Cary Swoveland
Cary Swoveland

Reputation: 110725

This solution addresses the title, rather than the example, and permits the selection of elements by class, as well as the rejection of elements by class.

Code

good_classes and bad_classes are arrays of classes.

def filter_select(arr, *good_classes)
  arr.select { |e| good_classes.include? e.class }
end

def filter_reject(arr, *bad_classes)
  arr.reject { |e| bad_classes.include? e.class }
end

Examples

arr = [1, :a, {b: 3}, "cat", [4,5], true, 3..4, false]

filter_select(arr, Fixnum, Hash, TrueClass, Range)
  #=> [1, {:b=>3}, true, 3..4]

filter_reject(arr, Fixnum, Hash, String, Array)
  #=> [:a, true, 3..4, false]

Upvotes: 1

Kzhunter
Kzhunter

Reputation: 627

I'd do
new_array = ary.reject {|x| x.is_a?(String)}

Upvotes: 0

Arup Rakshit
Arup Rakshit

Reputation: 118289

I'd do :-

ary = ["--",1,2,3,4]
ary = ary.grep(Integer) 
ary # => [1, 2, 3, 4]

Note :- If you don't want to mutate the original array use new_ary instead of ary. Like

new_ary = ary.grep(Integer) 

Upvotes: 5

Brandon Buck
Brandon Buck

Reputation: 7181

You can use delete_if to remove items from the list, however this modifies the list.

a = ["--", 1, 2, 3, 4]
a.delete_if { |n| !n.kind_of?(Fixnum) }
p a

You can select items out of the list maintaining the original list by using select

a = ["--", 1, 2, 3, 4]
b = a.select { |n| n.kind_of?(Fixnum) }
p b
p a

Upvotes: 2

Related Questions