sjs*_*jsc 32 ruby ruby-on-rails
我希望在Ruby中找到一种方法来选择数组中的每个第n项.例如,选择每一个项目将转换:
["cat", "dog", "mouse", "tiger"]
Run Code Online (Sandbox Code Playgroud)
成:
["dog", "tiger"]
Run Code Online (Sandbox Code Playgroud)
是否有Ruby方法可以这样做,还是有其他方法可以做到这一点?
我尝试过使用类似的东西:
[1,2,3,4].select {|x| x % 2 == 0}
# results in [2,4]
Run Code Online (Sandbox Code Playgroud)
但这只适用于具有整数而不是字符串的数组.
Mla*_*vić 53
你可以使用Enumerable#each_slice
:
["cat", "dog", "mouse", "tiger"].each_slice(2).map(&:last)
# => ["dog", "tiger"]
Run Code Online (Sandbox Code Playgroud)
更新:
正如评论中所提到的,last
并不总是合适的,所以它可以替换为first
,并跳过第一个元素:
["cat", "dog", "mouse", "tiger"].drop(1).each_slice(2).map(&:first)
Run Code Online (Sandbox Code Playgroud)
不幸的是,让它不那么优雅.
IMO,最优雅的是使用.select.with_index
,Nakilon在他的评论中建议:
["cat", "dog", "mouse", "tiger"].select.with_index{|_,i| (i+1) % 2 == 0}
Run Code Online (Sandbox Code Playgroud)
mu *_*ort 18
你也可以使用步骤:
n = 2
a = ["cat", "dog", "mouse", "tiger"]
b = (n - 1).step(a.size - 1, n).map { |i| a[i] }
Run Code Online (Sandbox Code Playgroud)
这个怎么样 -
arr = ["cat", "dog", "mouse", "tiger"]
n = 2
(0... arr.length).select{ |x| x%n == n-1 }.map { |y| arr[y] }
#=> ["dog", "tiger"]
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以简单地使用values_at
方法。您可以在文档中轻松找到它。
这里有些例子:
array = ["Hello", 2, "apple", 3]
array.values_at(0,1) # pass any number of arguments you like
=> ["Hello", 2]
array.values_at(0..3) # an argument can be a range
=>["Hello", 2, "apple", 3]
Run Code Online (Sandbox Code Playgroud)
我相信这可以解决“狗”和“老虎”的问题
array = ["cat", "dog", "mouse", "tiger"]
array.values_at(1,3)
Run Code Online (Sandbox Code Playgroud)
和你的另一个数组
[1,2,3,4].values_at(1,3)
=> [2, 4]
Run Code Online (Sandbox Code Playgroud)