是否有任何内置的 Array 或 Enumerable 允许我使用块搜索元素并返回其索引?
类似的东西:
ar = [15,2,33,4,50,69]
indexes = ar.find_indexes {|item| item > 4 == 0}
# indexes will now contain 0,2,4,5
添加我自己的很容易,但我想知道这是否已经存在?
是否有任何内置的 Array 或 Enumerable 允许我使用块搜索元素并返回其索引?
类似的东西:
ar = [15,2,33,4,50,69]
indexes = ar.find_indexes {|item| item > 4 == 0}
# indexes will now contain 0,2,4,5
添加我自己的很容易,但我想知道这是否已经存在?
我认为没有内置任何内容,至少我没有注意到Array或Enumerable文档中以前未检测到的任何内容。
不过,这非常简洁:
(0..ar.size-1).select { |i| ar[i] > 4 }
编辑:应该提到这是 Ruby 1.8.6。
另一个编辑:忘记了三点,它可以保存整个角色,以及清理-1
我不满意的 .
(0...ar.size).select { |i| ar[i] > 4 }
我知道这只是 ruby 1.9
indexes = ar.collect.with_index { |elem, index| index if elem > 4 }.
select { |elem| not elem.nil? }
编辑:对于 ruby 1.8 试试
require 'enumerator'
indexes = ar.to_enum(:each_with_index).
collect { |elem, index| index if elem > 4 }.
select { |elem| not elem.nil? }
就让注入法的威力爆炸吧!!!;-)
ar.inject([]){|a,i| a.empty? ? a << [0, i] : a << [a.last[0]+1,i]}
.select{|a| a[1] > 4}
.map{|a| a[0]}
(适用于红宝石 1.8.6)
不,但是如果您愿意,您可以随时对其进行修补:
class Array
def find_indexes(&block)
(0..size-1).select { |i| block.call(self[i]) }
end
end
ar = [15,2,33,4,50,69]
p ar.find_indexes {|item| item > 4 } #=> [0, 2, 4, 5]
它本质上是迈克伍德豪斯的答案重新格式化以删除丑陋的范围。
ar.each_index.select{|item| item > 4}
这是适用于 Ruby 1.8.7 的 johnanthonyboyd 的答案版本
ar.enum_with_index.each.select{|item| item.first > 4}.map(&:last)