47

How can you iterate through an array of objects and return the entire object if a certain attribute is correct?

I have the following in my rails app

array_of_objects.each { |favor| favor.completed == false }

array_of_objects.each { |favor| favor.completed }

but for some reason these two return the same result! I have tried to replace each with collect, map, keep_if as well as !favor.completed instead of favor.completed == false and none of them worked!

Any help is highly appreciated!

fardin
  • 1,181
  • 4
  • 14
  • 23
  • What I want is to return the entire object `favor` if `favor.completed` and if `!favor.completed` – fardin Jan 30 '16 at 18:11
  • 1
    the `each` method always returns the original array. – Sagar Pandya Jan 30 '16 at 18:11
  • 1
    Just to qualify @sugar's comment, when it has a block, [Array#each](http://ruby-doc.org/core-2.2.0/Array.html#method-i-each) returns its receiver. – Cary Swoveland Jan 30 '16 at 19:04
  • What do you mean by, "return the *entire* object"? Do you mean you want to return an array of those objects from the first array for which a given attribute evaluates `true`? Or evaluates 'false'? – Cary Swoveland Jan 30 '16 at 19:11
  • yes that's what I meant. I don't want to have the attribute returned – fardin Jan 30 '16 at 21:05

4 Answers4

62
array_of_objects.select { |favor| favor.completed == false }

Will return all the objects that's completed is false.

You can also use find_all instead of select.

Babar Al-Amin
  • 3,779
  • 1
  • 15
  • 20
14

For first case,

array_of_objects.reject(&:completed)

For second case,

array_of_objects.select(&:completed)
Wand Maker
  • 18,008
  • 8
  • 50
  • 83
2

You need to use Enumerable#find_all to get the all matched objects.

array_of_objects.find_all { |favor| favor.completed == false }
Arup Rakshit
  • 113,563
  • 27
  • 250
  • 306
0

For newer versions of ruby, you can use filter method

array_of_objects.filter { |favor| favor.completed == false }

Reference: https://apidock.com/ruby/Array/filter

prajeesh
  • 1,994
  • 5
  • 27
  • 47