简体   繁体   中英

Filter Array in Ruby on Rails with only to_s elements

I have this code that works well

def self.select_some_elements(some_value)
   return elements.select { |element| element.some_value > some_value}
end

This code returns an array of elements class instances/objects. However, I would like to return the array of element.to_s instances/propeties, not the whole class objects, just strings/string properties

Is there a quick way to do it without going extra steps?

Introduction:

So, what you have achieved is a set (array in this case) of objects, which is great. What you have to do now is to transform this set into a different one: namely, replace each object with what that object's method to_s returns. There's a perfect method for that, called map . It goes through all the items, calls a block with each item as an argument and puts in the resulting array what the block has returned:

Open irb console and play around:

>> [1,2,3].map{|x| 1}
=> [1, 1, 1]
>> [1,2,3].map{|x| x+1}
=> [2, 3, 4]
>> [1,2,3].map{|x| "a"}
=> ["a", "a", "a"]
>> [1,2,3].map{|x| x.to_s}
=> ["1", "2", "3"]
>> [1,2,3].map(&:to_s)
=> ["1", "2", "3"]

The last transformation seems to be what you need:

The answer: Add .map(&:to_s) at the end like this

def self.select_some_elements(some_value)
   return elements.select { |element| element.some_value > some_value}.map(&:to_s)
end

.map(&:to_s) is a short version of .map { |element| element.to_s } .map { |element| element.to_s } . And you can read about Arra3#map in the docs

And when you wrap your head around the #map , check out Stefan's answer which shows how select{}.map can be "compressed" into one filter_map call (doing both things: filter, and mapping in one iteration over the set instead of two).

Starting with Ruby 2.7 there's filter_map :

elements = [1, 2, 3, 4, 5]

elements.filter_map { |e| e.to_s if e > 2 }
#=> ["3", "4", "5"]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM