56

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,399
  • 4
  • 16
  • 27
  • 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

72
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,939
  • 1
  • 16
  • 20
15

For first case,

array_of_objects.reject(&:completed)

For second case,

array_of_objects.select(&:completed)
Wand Maker
  • 18,476
  • 8
  • 53
  • 87
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
  • 116,827
  • 30
  • 260
  • 317
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
  • 2,202
  • 6
  • 34
  • 59
  • "Newest" means Ruby from 1.8.6_287 ?? (by [your reference](https://apidock.com/ruby/Array/filter)) – Cadoiz Jul 20 '23 at 09:28