3

我有一个这样的数组:

stuff = ["A", " ", "C", " ", "E", " ", "G"]

我想返回一个数据为空格的所有索引的数组。例如:

[1, 3, 5]

有没有很好的功能性方法来做到这一点?我知道有一种each_with_index方法返回一个Enumerable,但我不知道如何使用过滤器来使用它。

编辑:NVM,尝试 30 分钟后才解决。这是我的方法。

indexes = stuff.collect.with_index { |elem, index| index if elem == " "}.
             select { |elem| not elem.nil? }
4

3 回答 3

4

让我为你缩短一点:

['A', ' ', 'C', ' ', 'E', ' ', 'G'].map.with_index { |e, i| i if e == ' ' }.compact

问题是你可以使用Enumerable#compact而不是做一个select. 此外,我发现#map它是更流行的术语,尤其是当您谈论函数式编程时,但归根结底就是苹果和橘子。

于 2012-07-16T08:33:38.327 回答
2

多年后,Ruby 2.7 提供Enumerable#filter_map()了使这更简单的:

stuff.filter_map.with_index { |e, i| i if e == ' ' }
于 2020-03-07T11:24:53.743 回答
1

如果您在多个地方使用它,我将使用此方法扩展 Array 类

class Array
  def index_all( val = nil )
    ary = []
    each_with_index { |x, i|
      ary.push(i) if x == val or block_given? && yield(x)
    }
    ary
  end
end

['A', ' ', 'C', ' ', 'E', ' ', 'G'].index_all(" ") #=> [1, 3, 5]
于 2012-07-16T11:07:36.187 回答