Arrays 如何使用regexp在Ruby数组中搜索多个元素

Arrays 如何使用regexp在Ruby数组中搜索多个元素,arrays,ruby,regex,search,Arrays,Ruby,Regex,Search,鉴于: 我可以找到第一个元素的索引,比如说,它以'bo'开头 my_array = ['america', 'bombay', 'bostwana', 'cameroon'] 如何找到所有这些元素?如果需要元素: my_array.find_index { |l| l.start_with? 'bo' } 如果需要索引: my_array.find { |element| element.start_with? 'bo' } # => "bombay" my_array.sele

鉴于:

我可以找到第一个元素的索引,比如说,它以
'bo'
开头

my_array = ['america', 'bombay', 'bostwana', 'cameroon']

如何找到所有这些元素?

如果需要元素:

my_array.find_index { |l| l.start_with? 'bo' }

如果需要索引:

my_array.find { |element| element.start_with? 'bo' }   # => "bombay"
my_array.select { |element| element.start_with? 'bo' } # => ["bombay", "bostwana"]

您可以将
map.with_index
与条件和
compact
结果一起使用

my_array.index { |element| element.start_with? 'bo' } # => 1
my_array.map.with_index.select { |element, _| element.start_with? 'bo' }.map(&:last)
  # => [1, 2]

这是怎么回事 地图

将获取所有值,并将它们“映射”到每个项传递到给定块时返回的值

my_array.map.with_index{ |element, index| index if element.start_with? 'bo' }.compact
与_索引一起

要获取索引值,可以使用以下方法:

my_array.map { |element| element.start_with? 'bo' }
# => [false, true, true, false]
紧凑型

然后,要去除
nil
值,可以调用返回的数组

my_array.map.with_index { |element, index| index }
# => [0, 1, 2, 3]

my_array.map.with_index { |element, index| index if element.start_with? 'bo' }
# => [nil, 1, 2, nil]
我发布这篇文章是为了展示很少使用的方法。接受用于基于三重等号大小写比较选择项目的任何内容


在那里传递
Proc
实例很酷,因为
Proc
有一个默认实现:它只是在接收方上被调用。

为了可读性,我会使用以下方法:

['america', 'bombay', 'bostwana', 'cameroon']
  .each_with_index # to get indices
  .grep(->(e) { e.first.start_with? "bo" }) # I ❤ Enumerable#grep
  .map(&:last) # get indices
#⇒ [1, 2]

谢谢,ndn。天哪,这(所有索引返回实现)看起来很可怕如果你认为我的问题值得的话,我可以请你投票支持我的问题吗?这里完全没有人(以防你没有意识到)。谢谢。它需要临时的局部变量2。它在每个迭代3上执行冗余的二次查找。事实上有3种方法。@mudasobwa,我数了4,n'est-ce pas?@CarySwoveland,我数了点<代码>数组#[]在前一项中被责骂:)你们两个都遗漏的关键词是“链”。我宁愿在每次迭代中进行一次“冗余”查找,也不愿在数据上迭代两次。不管怎样:可读性。因为可读性虽然重要,但不是唯一重要的因素,而且因为一旦我开始思考,我就无法抗拒,所以我以答案为基准:棒极了!斯科特,非常感谢你一步一步来。非常感谢!你对@davidhu2000现在被删除的答案的最后评论(“我需要投票,所以如果你认为这是值得的,请把问题投上去。”)类似于“我需要一个“A”,所以如果你认为我值得,请给我一个”。不要乞求,这是不合适的。如果您只需要元素而不是它们的索引,那么
my\u array.grep(/^bo/)
就足够了。
['america', 'bombay', 'bostwana', 'cameroon']
  .each_with_index # to get indices
  .grep(->(e) { e.first.start_with? "bo" }) # I ❤ Enumerable#grep
  .map(&:last) # get indices
#⇒ [1, 2]
my_array.each_index.select {|idx| my_array[idx].start_with?("bo") }